diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index 916277329e..918335bf91 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -200,6 +200,19 @@ + + + + + + + + + + + + + diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs index 87aaa3d84a..60ca8b4804 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs @@ -148,7 +148,7 @@ namespace Umbraco.Tests.Cache.PublishedCache var result = new SearchResult() { - Id = 1234, + LongId = 1234, Score = 1 }; result.Fields.Add("__IndexType", "media"); diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index d079b3bb83..9f27e172c6 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -55,8 +55,8 @@ ..\packages\AutoMapper.4.2.1\lib\net45\AutoMapper.dll True - - ..\packages\Examine.0.1.68.0\lib\Examine.dll + + ..\packages\Examine.2.0.0-beta8\lib\net45\Examine.dll True @@ -71,9 +71,49 @@ ..\packages\log4net.2.0.5\lib\net45-full\log4net.dll True - - False - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Analyzers.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Core.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.FastVectorHighlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Highlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Memory.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Queries.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Regex.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SimpleFacetedSearch.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Snowball.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SpellChecker.dll + True ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll diff --git a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs index 5fed998194..2fe3b275cf 100644 --- a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs @@ -13,8 +13,6 @@ namespace Umbraco.Tests.UmbracoExamine [SetUp] public virtual void TestSetup() { - UmbracoExamineSearcher.DisableInitializationCheck = true; - BaseUmbracoIndexer.DisableInitializationCheck = true; ShortStringHelperResolver.Current = new ShortStringHelperResolver(new DefaultShortStringHelper(SettingsForTests.GetDefault())); Resolution.Freeze(); @@ -23,9 +21,6 @@ namespace Umbraco.Tests.UmbracoExamine [TearDown] public virtual void TestTearDown() { - UmbracoExamineSearcher.DisableInitializationCheck = null; - BaseUmbracoIndexer.DisableInitializationCheck = null; - //reset all resolvers ResolverCollection.ResetAll(); //reset resolution itself (though this should be taken care of by resetting any of the resolvers above) diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs index d045645726..76d9dbe1ec 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs @@ -91,25 +91,38 @@ namespace Umbraco.Tests.UmbracoExamine if (analyzer == null) { - analyzer = new StandardAnalyzer(Version.LUCENE_29); + analyzer = new StandardAnalyzer(Version.LUCENE_30); } - var indexSet = new IndexSet(); - var indexCriteria = indexSet.ToIndexCriteria(dataService, UmbracoContentIndexer.IndexFieldPolicies); - - var i = new UmbracoContentIndexer(indexCriteria, - luceneDir, //custom lucene directory - dataService, - contentService, - mediaService, - dataTypeService, - userService, - new[] { new DefaultUrlSegmentProvider() }, - analyzer, - false); + //var indexSet = new IndexSet(); + // var indexCriteria = indexSet.ToIndexCriteria(dataService, UmbracoContentIndexer.IndexFieldPolicies); + + //var i = new UmbracoContentIndexer(indexCriteria, + // luceneDir, //custom lucene directory + // dataService, + // contentService, + // mediaService, + // dataTypeService, + // userService, + // new[] { new DefaultUrlSegmentProvider() }, + // analyzer, + // false); //i.IndexSecondsInterval = 1; + var i = new UmbracoContentIndexer( + new[] + { + new FieldDefinition("", FieldDefinitionTypes.FullText) + }, + luceneDir, + analyzer, + contentService, + mediaService, + dataTypeService, + userService, + new[] { new DefaultUrlSegmentProvider() }); + i.IndexingError += IndexingError; return i; diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs b/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs index cfde313968..fcb202767b 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs @@ -3,14 +3,20 @@ using System.Collections.Generic; using System.Linq; using Examine; using Examine.LuceneEngine; +using Examine.LuceneEngine.Config; using Examine.LuceneEngine.Providers; using Examine.LuceneEngine.SearchCriteria; using Examine.SearchCriteria; +using Lucene.Net.Analysis.Standard; using Lucene.Net.Index; using Lucene.Net.Search; using Lucene.Net.Store; +using Moq; using NUnit.Framework; +using Umbraco.Core.Services; +using Umbraco.Core.Strings; using UmbracoExamine; +using Version = Lucene.Net.Util.Version; namespace Umbraco.Tests.UmbracoExamine { @@ -30,22 +36,27 @@ namespace Umbraco.Tests.UmbracoExamine public void Index_Protected_Content_Not_Indexed() { - var protectedQuery = new BooleanQuery(); - protectedQuery.Add( - new BooleanClause( - new TermQuery(new Term(LuceneIndexer.IndexTypeFieldName, IndexTypes.Content)), - BooleanClause.Occur.MUST)); + using (var luceneDir = new RAMDirectory()) + using (var indexer = IndexInitializer.GetUmbracoIndexer(luceneDir)) + using (var searcher = indexer.GetSearcher().GetSearcher()) + { + var protectedQuery = new BooleanQuery(); + protectedQuery.Add( + new BooleanClause( + new TermQuery(new Term(LuceneIndexer.IndexTypeFieldName, IndexTypes.Content)), + Occur.MUST)); - protectedQuery.Add( - new BooleanClause( - new TermQuery(new Term(LuceneIndexer.IndexNodeIdFieldName, TestContentService.ProtectedNode.ToString())), - BooleanClause.Occur.MUST)); + protectedQuery.Add( + new BooleanClause( + new TermQuery(new Term(LuceneIndexer.IndexNodeIdFieldName, TestContentService.ProtectedNode.ToString())), + Occur.MUST)); - var collector = new AllHitsCollector(false, true); - var s = _searcher.GetSearcher(); - s.Search(protectedQuery, collector); + var collector = TopScoreDocCollector.Create(int.MaxValue, true); + + searcher.Search(protectedQuery, collector); - Assert.AreEqual(0, collector.Count, "Protected node should not be indexed"); + Assert.AreEqual(0, collector.TotalHits, "Protected node should not be indexed"); + } } @@ -142,8 +153,6 @@ namespace Umbraco.Tests.UmbracoExamine { var s = (IndexSearcher)_searcher.GetSearcher(); - - //first delete all 'Content' (not media). This is done by directly manipulating the index with the Lucene API, not examine! var contentTerm = new Term(LuceneIndexer.IndexTypeFieldName, IndexTypes.Content); @@ -197,30 +206,29 @@ namespace Umbraco.Tests.UmbracoExamine private readonly TestMediaService _mediaService = new TestMediaService(); - private static UmbracoExamineSearcher _searcher; - private static UmbracoContentIndexer _indexer; + //private static UmbracoExamineSearcher _searcher; + //private static UmbracoContentIndexer _indexer; #endregion #region Initialize and Cleanup - private Lucene.Net.Store.Directory _luceneDir; + //private Lucene.Net.Store.Directory _luceneDir; public override void TestTearDown() { base.TestTearDown(); - _luceneDir.Dispose(); - UmbracoExamineSearcher.DisableInitializationCheck = null; - BaseUmbracoIndexer.DisableInitializationCheck = null; + //_luceneDir.Dispose(); } public override void TestSetup() { base.TestSetup(); - _luceneDir = new RAMDirectory(); - _indexer = IndexInitializer.GetUmbracoIndexer(_luceneDir); - _indexer.RebuildIndex(); - _searcher = IndexInitializer.GetUmbracoSearcher(_luceneDir); + //_luceneDir = new RAMDirectory(); + + // _indexer = IndexInitializer.GetUmbracoIndexer(_luceneDir); + //_indexer.RebuildIndex(); + //_searcher = IndexInitializer.GetUmbracoSearcher(_luceneDir); } diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 7b5780daa2..005aa46c82 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -2,10 +2,11 @@ - + - + + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 0b89ed19a5..1f29eb2227 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -120,8 +120,8 @@ ..\packages\ClientDependency-Mvc5.1.8.0.0\lib\net45\ClientDependency.Core.Mvc.dll True - - ..\packages\Examine.0.1.68.0\lib\Examine.dll + + ..\packages\Examine.2.0.0-beta8\lib\net45\Examine.dll True @@ -140,9 +140,49 @@ ..\packages\log4net.2.0.5\lib\net45-full\log4net.dll True - - False - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Analyzers.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Core.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.FastVectorHighlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Highlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Memory.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Queries.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Regex.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SimpleFacetedSearch.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Snowball.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SpellChecker.dll + True ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index 43d9348b81..e76bb67d87 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -3,11 +3,12 @@ - + - + + diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config index ff221c2efe..a3d059a62f 100644 --- a/src/Umbraco.Web.UI/web.Template.config +++ b/src/Umbraco.Web.UI/web.Template.config @@ -409,7 +409,10 @@ - + + + + diff --git a/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs b/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs index 3cc7908dfd..66704d0c8b 100644 --- a/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs +++ b/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs @@ -21,7 +21,10 @@ namespace Umbraco.Web.Search /// public static int GetIndexDocumentCount(this LuceneIndexer indexer) { - using (var reader = indexer.GetIndexWriter().GetReader()) + var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher; + if (searcher == null) return 0; + using (searcher) + using (var reader = searcher.IndexReader) { return reader.NumDocs(); } @@ -34,7 +37,10 @@ namespace Umbraco.Web.Search /// public static int GetIndexFieldCount(this LuceneIndexer indexer) { - using (var reader = indexer.GetIndexWriter().GetReader()) + 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; } @@ -47,7 +53,10 @@ namespace Umbraco.Web.Search /// public static bool IsIndexOptimized(this LuceneIndexer indexer) { - using (var reader = indexer.GetIndexWriter().GetReader()) + var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher; + if (searcher == null) return true; + using (searcher) + using (var reader = searcher.IndexReader) { return reader.IsOptimized(); } @@ -74,9 +83,12 @@ namespace Umbraco.Web.Search /// public static int GetDeletedDocumentsCount(this LuceneIndexer indexer) { - using (var reader = indexer.GetIndexWriter().GetReader()) + var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher; + if (searcher == null) return 0; + using (searcher) + using (var reader = searcher.IndexReader) { - return reader.NumDeletedDocs(); + return reader.NumDeletedDocs; } } } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 7dd0f6b41d..d233c6a606 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -113,9 +113,8 @@ ..\packages\dotless.1.4.1.0\lib\dotless.Core.dll - - ..\packages\Examine.0.1.68.0\lib\Examine.dll - False + + ..\packages\Examine.2.0.0-beta8\lib\net45\Examine.dll True @@ -146,9 +145,49 @@ ..\packages\log4net.2.0.5\lib\net45-full\log4net.dll True - - False - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Analyzers.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Core.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.FastVectorHighlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Highlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Memory.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Queries.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Regex.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SimpleFacetedSearch.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Snowball.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SpellChecker.dll + True ..\packages\Markdown.1.14.4\lib\net45\MarkdownSharp.dll diff --git a/src/Umbraco.Web/app.config b/src/Umbraco.Web/app.config index 51ada1725b..00dbc98091 100644 --- a/src/Umbraco.Web/app.config +++ b/src/Umbraco.Web/app.config @@ -71,6 +71,14 @@ + + + + + + + + diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index abafc5dcc2..c52a4112cf 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -3,14 +3,15 @@ - + - + + diff --git a/src/UmbracoExamine/BaseUmbracoIndexer.cs b/src/UmbracoExamine/BaseUmbracoIndexer.cs index ca0d3063d0..cb5323412a 100644 --- a/src/UmbracoExamine/BaseUmbracoIndexer.cs +++ b/src/UmbracoExamine/BaseUmbracoIndexer.cs @@ -12,8 +12,11 @@ using UmbracoExamine.DataServices; using Examine; using System.IO; using System.Xml.Linq; +using Examine.LuceneEngine.Faceting; +using Examine.LuceneEngine.Indexing; using Lucene.Net.Store; using UmbracoExamine.LocalStorage; +using Directory = Lucene.Net.Store.Directory; namespace UmbracoExamine { @@ -34,31 +37,34 @@ namespace UmbracoExamine { } - /// - /// Constructor to allow for creating an indexer at runtime - /// - /// - /// - /// - /// - protected BaseUmbracoIndexer(IIndexCriteria indexerData, DirectoryInfo indexPath, IDataService dataService, Analyzer analyzer, bool async) - : base(indexerData, indexPath, analyzer, async) + protected BaseUmbracoIndexer(IEnumerable fieldDefinitions, Directory luceneDirectory, Analyzer defaultAnalyzer, FacetConfiguration facetConfiguration = null, IDictionary> indexValueTypes = null) + : base(fieldDefinitions, luceneDirectory, defaultAnalyzer, facetConfiguration, indexValueTypes) { - DataService = dataService; } - protected BaseUmbracoIndexer(IIndexCriteria indexerData, Lucene.Net.Store.Directory luceneDirectory, IDataService dataService, Analyzer analyzer, bool async) - : base(indexerData, luceneDirectory, analyzer, async) - { - DataService = dataService; - } + // /// + // /// Constructor to allow for creating an indexer at runtime + // /// + // /// + // /// + // /// + // /// + // [Obsolete("Do not use the ctor using IIndexCriteria, it is obsolete")] + // protected BaseUmbracoIndexer(IIndexCriteria indexerData, DirectoryInfo indexPath, IDataService dataService, Analyzer analyzer, bool async) + // : base(indexerData, indexPath, analyzer, async) + // { + // DataService = dataService; + // } + + // [Obsolete("Do not use the ctor using IIndexCriteria, it is obsolete")] + //protected BaseUmbracoIndexer(IIndexCriteria indexerData, Lucene.Net.Store.Directory luceneDirectory, IDataService dataService, Analyzer analyzer, bool async) + // : base(indexerData, luceneDirectory, analyzer, async) + //{ + // DataService = dataService; + //} #endregion - - /// - /// Used for unit tests - /// - internal static bool? DisableInitializationCheck = null; + private readonly LocalTempStorageIndexer _localTempStorageIndexer = new LocalTempStorageIndexer(); private BaseLuceneSearcher _internalTempStorageSearcher = null; @@ -89,6 +95,7 @@ namespace UmbracoExamine /// public bool SupportUnpublishedContent { get; protected set; } + //TODO: Probably get rid of this right ? /// /// The data service used for retreiving and submitting data to the cms /// @@ -176,35 +183,7 @@ namespace UmbracoExamine } #endregion - - /// - /// Used to aquire the internal searcher - /// - private readonly object _internalSearcherLocker = new object(); - - protected override BaseSearchProvider InternalSearcher - { - get - { - //if temp local storage is configured use that, otherwise return the default - if (UseTempStorage) - { - if (_internalTempStorageSearcher == null) - { - lock (_internalSearcherLocker) - { - if (_internalTempStorageSearcher == null) - { - _internalTempStorageSearcher = new LuceneSearcher(GetIndexWriter(), IndexingAnalyzer); - } - } - } - return _internalTempStorageSearcher; - } - - return base.InternalSearcher; - } - } + public override Lucene.Net.Store.Directory GetLuceneDirectory() { @@ -216,21 +195,7 @@ namespace UmbracoExamine return base.GetLuceneDirectory(); - } - - protected override IndexWriter CreateIndexWriter() - { - //if temp local storage is configured use that, otherwise return the default - if (UseTempStorage) - { - var directory = GetLuceneDirectory(); - return new IndexWriter(GetLuceneDirectory(), IndexingAnalyzer, - DeletePolicyTracker.Current.GetPolicy(directory), - IndexWriter.MaxFieldLength.UNLIMITED); - } - - return base.CreateIndexWriter(); - } + } ///// ///// Override to check if we can actually initialize. @@ -306,18 +271,14 @@ namespace UmbracoExamine /// protected bool CanInitialize() { - //check the DisableInitializationCheck and ensure that it is not set to true - if (!DisableInitializationCheck.HasValue || !DisableInitializationCheck.Value) + //We need to check if we actually can initialize, if not then don't continue + if (ApplicationContext.Current == null + || !ApplicationContext.Current.IsConfigured + || !ApplicationContext.Current.DatabaseContext.IsDatabaseConfigured) { - //We need to check if we actually can initialize, if not then don't continue - if (ApplicationContext.Current == null - || !ApplicationContext.Current.IsConfigured - || !ApplicationContext.Current.DatabaseContext.IsDatabaseConfigured) - { - return false; - } + return false; } - + return true; } diff --git a/src/UmbracoExamine/DeletePolicyTracker.cs b/src/UmbracoExamine/DeletePolicyTracker.cs index 3edcd12a24..1697a797c1 100644 --- a/src/UmbracoExamine/DeletePolicyTracker.cs +++ b/src/UmbracoExamine/DeletePolicyTracker.cs @@ -16,7 +16,7 @@ namespace UmbracoExamine public IndexDeletionPolicy GetPolicy(Lucene.Net.Store.Directory directory) { - var resolved = _directories.GetOrAdd(directory.GetLockID(), s => new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy())); + var resolved = _directories.GetOrAdd(directory.GetLockId(), s => new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy())); return resolved; } } diff --git a/src/UmbracoExamine/LocalStorage/LocalTempStorageDirectory.cs b/src/UmbracoExamine/LocalStorage/LocalTempStorageDirectory.cs index b1dce7ef2d..e902c03e9e 100644 --- a/src/UmbracoExamine/LocalStorage/LocalTempStorageDirectory.cs +++ b/src/UmbracoExamine/LocalStorage/LocalTempStorageDirectory.cs @@ -34,13 +34,7 @@ namespace UmbracoExamine.LocalStorage /// If initialization fails, it will be disabled and then this will just wrap the 'real directory' /// internal bool Enabled { get; set; } - - [Obsolete("this is deprecated")] - public override string[] List() - { - return _realDirectory.List(); - } - + public override string[] ListAll() { //always from the real dir @@ -85,18 +79,7 @@ namespace UmbracoExamine.LocalStorage _tempStorageDir.DeleteFile(name); } } - - [Obsolete("This is deprecated")] - public override void RenameFile(string @from, string to) - { - _realDirectory.RenameFile(@from, to); - - //perform on both dirs - if (Enabled) - { - _tempStorageDir.RenameFile(@from, to); - } - } + /// Returns the length of a file in the directory. public override long FileLength(string name) @@ -160,16 +143,7 @@ namespace UmbracoExamine.LocalStorage _realDirectory.Sync(name); _tempStorageDir.Sync(name); base.Sync(name); - } - - public override void Close() - { - if (Enabled) - { - _tempStorageDir.Close(); - } - _realDirectory.Close(); - } + } public override Lock MakeLock(string name) { @@ -185,15 +159,19 @@ namespace UmbracoExamine.LocalStorage /// "scopes" to the right index. /// /// - public override string GetLockID() + public override string GetLockId() { - return string.Concat(_realDirectory.GetLockID(), _tempStorageDir.GetLockID()); + return string.Concat(_realDirectory.GetLockId(), _tempStorageDir.GetLockId()); } - - public override LockFactory GetLockFactory() + + public override LockFactory LockFactory { - return _lockFactory; - //return _realDirectory.GetLockFactory(); + get + { + return _lockFactory; + //return _realDirectory.GetLockFactory(); + } + } public override void ClearLock(string name) @@ -208,20 +186,21 @@ namespace UmbracoExamine.LocalStorage //} } + protected override void Dispose(bool disposing) + { + if (Enabled) + { + _tempStorageDir.Dispose(); + } + _realDirectory.Dispose(); + } + public override void SetLockFactory(LockFactory lf) { _lockFactory = lf; //_realDirectory.SetLockFactory(lf); } - - public override void Dispose() - { - if (Enabled) - { - _tempStorageDir.Dispose(); - } - _realDirectory.Dispose(); - } + } diff --git a/src/UmbracoExamine/LocalStorage/LocalTempStorageIndexer.cs b/src/UmbracoExamine/LocalStorage/LocalTempStorageIndexer.cs index f4642eb0cd..0adc880f70 100644 --- a/src/UmbracoExamine/LocalStorage/LocalTempStorageIndexer.cs +++ b/src/UmbracoExamine/LocalStorage/LocalTempStorageIndexer.cs @@ -68,6 +68,8 @@ namespace UmbracoExamine.LocalStorage if (tempPath == null) throw new InvalidOperationException("Could not resolve a temp location from the " + localStorageDir.GetType() + " specified"); TempPath = tempPath.FullName; + throw new NotSupportedException("Fix the local storage stuff!"); + switch (localStorageType) { case LocalStorageType.Sync: @@ -126,13 +128,13 @@ namespace UmbracoExamine.LocalStorage } break; - case LocalStorageType.LocalOnly: - if (Directory.Exists(TempPath) == false) - { - Directory.CreateDirectory(TempPath); - } - LuceneDirectory = DirectoryTracker.Current.GetDirectory(new DirectoryInfo(TempPath)); - break; + //case LocalStorageType.LocalOnly: + // if (Directory.Exists(TempPath) == false) + // { + // Directory.CreateDirectory(TempPath); + // } + // LuceneDirectory = DirectoryTracker.Current.GetDirectory(new DirectoryInfo(TempPath)); + // break; default: throw new ArgumentOutOfRangeException("localStorageType"); } @@ -324,10 +326,10 @@ namespace UmbracoExamine.LocalStorage var basePath = IOHelper.MapPath(configuredPath); var commit = Snapshotter.Snapshot(); - var allSnapshotFiles = commit.GetFileNames() + var allSnapshotFiles = commit.FileNames .Concat(new[] { - commit.GetSegmentsFileName(), + commit.SegmentsFileName, //we need to manually include the segments.gen file "segments.gen" }) diff --git a/src/UmbracoExamine/LocalStorage/MultiIndexLockFactory.cs b/src/UmbracoExamine/LocalStorage/MultiIndexLockFactory.cs index 8d08041021..55bb986ce9 100644 --- a/src/UmbracoExamine/LocalStorage/MultiIndexLockFactory.cs +++ b/src/UmbracoExamine/LocalStorage/MultiIndexLockFactory.cs @@ -21,13 +21,13 @@ namespace UmbracoExamine.LocalStorage public override Lock MakeLock(string lockName) { - return new MultiIndexLock(_master.GetLockFactory().MakeLock(lockName), _child.GetLockFactory().MakeLock(lockName)); + return new MultiIndexLock(_master.LockFactory.MakeLock(lockName), _child.LockFactory.MakeLock(lockName)); } public override void ClearLock(string lockName) { - _master.GetLockFactory().ClearLock(lockName); - _child.GetLockFactory().ClearLock(lockName); + _master.LockFactory.ClearLock(lockName); + _child.LockFactory.ClearLock(lockName); } } } \ No newline at end of file diff --git a/src/UmbracoExamine/LocalStorage/MultiIndexOutput.cs b/src/UmbracoExamine/LocalStorage/MultiIndexOutput.cs index fed13643b8..a43a561c5d 100644 --- a/src/UmbracoExamine/LocalStorage/MultiIndexOutput.cs +++ b/src/UmbracoExamine/LocalStorage/MultiIndexOutput.cs @@ -41,18 +41,22 @@ namespace UmbracoExamine.LocalStorage } } - public override void Close() + protected override void Dispose(bool isDisposing) { foreach (var output in _outputs) { - output.Close(); + output.Dispose(); } } - public override long GetFilePointer() + public override long FilePointer { - //return the first - return _outputs.First().GetFilePointer(); + get + { + //return the first + return _outputs[0].FilePointer; + } + } public override void Seek(long pos) @@ -63,10 +67,14 @@ namespace UmbracoExamine.LocalStorage } } - public override long Length() + public override long Length { - //return the first - return _outputs.First().GetFilePointer(); + get + { + //return the first + return _outputs[0].FilePointer; + } + } } } \ No newline at end of file diff --git a/src/UmbracoExamine/UmbracoContentIndexer.cs b/src/UmbracoExamine/UmbracoContentIndexer.cs index 86f8487a56..276c41260a 100644 --- a/src/UmbracoExamine/UmbracoContentIndexer.cs +++ b/src/UmbracoExamine/UmbracoContentIndexer.cs @@ -12,8 +12,11 @@ using Umbraco.Core.Strings; using UmbracoExamine.DataServices; using Examine.LuceneEngine; using Examine.LuceneEngine.Config; +using Examine.LuceneEngine.Faceting; +using Examine.LuceneEngine.Indexing; using UmbracoExamine.Config; using Lucene.Net.Analysis; +using Lucene.Net.Store; using IContentService = Umbraco.Core.Services.IContentService; using IMediaService = Umbraco.Core.Services.IMediaService; @@ -46,29 +49,18 @@ namespace UmbracoExamine _urlSegmentProviders = UrlSegmentProviderResolver.Current.Providers; } - - /// - /// Constructor to allow for creating an indexer at runtime - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public UmbracoContentIndexer(IIndexCriteria indexerData, Lucene.Net.Store.Directory luceneDirectory, IDataService dataService, + public UmbracoContentIndexer( + IEnumerable fieldDefinitions, + Directory luceneDirectory, + Analyzer defaultAnalyzer, IContentService contentService, - IMediaService mediaService, - IDataTypeService dataTypeService, - IUserService userService, - IEnumerable urlSegmentProviders, - Analyzer analyzer, - bool async) - : base(indexerData, luceneDirectory, dataService, analyzer, async) + IMediaService mediaService, + IDataTypeService dataTypeService, + IUserService userService, + IEnumerable urlSegmentProviders, + FacetConfiguration facetConfiguration = null, + IDictionary> indexValueTypes = null) + : base(fieldDefinitions, luceneDirectory, defaultAnalyzer, facetConfiguration, indexValueTypes) { ContentService = contentService; MediaService = mediaService; @@ -77,11 +69,41 @@ namespace UmbracoExamine _urlSegmentProviders = urlSegmentProviders; } + ///// + ///// Constructor to allow for creating an indexer at runtime + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + //public UmbracoContentIndexer(IIndexCriteria indexerData, Lucene.Net.Store.Directory luceneDirectory, IDataService dataService, + // IContentService contentService, + // IMediaService mediaService, + // IDataTypeService dataTypeService, + // IUserService userService, + // IEnumerable urlSegmentProviders, + // Analyzer analyzer, + // bool async) + // : base(indexerData, luceneDirectory, dataService, analyzer, async) + //{ + // ContentService = contentService; + // MediaService = mediaService; + // DataTypeService = dataTypeService; + // UserService = userService; + // _urlSegmentProviders = urlSegmentProviders; + //} + #endregion #region Constants & Fields - + /// /// Used to store the path of a content object @@ -279,27 +301,29 @@ namespace UmbracoExamine /// ID of the node to delete public override void DeleteFromIndex(string nodeId) { - //find all descendants based on path - var descendantPath = string.Format(@"\-1\,*{0}\,*", nodeId); - var rawQuery = string.Format("{0}:{1}", IndexPathFieldName, descendantPath); - var c = InternalSearcher.CreateSearchCriteria(); - var filtered = c.RawQuery(rawQuery); - var results = InternalSearcher.Search(filtered); + throw new NotImplementedException("Fix DeleteFromIndex!"); - DataService.LogService.AddVerboseLog(int.Parse(nodeId), string.Format("DeleteFromIndex with query: {0} (found {1} results)", rawQuery, results.Count())); + ////find all descendants based on path + //var descendantPath = string.Format(@"\-1\,*{0}\,*", nodeId); + //var rawQuery = string.Format("{0}:{1}", IndexPathFieldName, descendantPath); + //var c = InternalSearcher.CreateSearchCriteria(); + //var filtered = c.RawQuery(rawQuery); + //var results = InternalSearcher.Search(filtered); - //need to create a delete queue item for each one found - foreach (var r in results) - { - EnqueueIndexOperation(new IndexOperation() - { - Operation = IndexOperationType.Delete, - Item = new IndexItem(null, "", r.Id.ToString()) - }); - //SaveDeleteIndexQueueItem(new KeyValuePair(IndexNodeIdFieldName, r.Id.ToString())); - } + //DataService.LogService.AddVerboseLog(int.Parse(nodeId), string.Format("DeleteFromIndex with query: {0} (found {1} results)", rawQuery, results.Count())); - base.DeleteFromIndex(nodeId); + ////need to create a delete queue item for each one found + //foreach (var r in results) + //{ + // EnqueueIndexOperation(new IndexOperation() + // { + // Operation = IndexOperationType.Delete, + // Item = new IndexItem(null, "", r.Id.ToString()) + // }); + // //SaveDeleteIndexQueueItem(new KeyValuePair(IndexNodeIdFieldName, r.Id.ToString())); + //} + + //base.DeleteFromIndex(nodeId); } #endregion diff --git a/src/UmbracoExamine/UmbracoExamine.csproj b/src/UmbracoExamine/UmbracoExamine.csproj index 7f137d11d0..10ab78696d 100644 --- a/src/UmbracoExamine/UmbracoExamine.csproj +++ b/src/UmbracoExamine/UmbracoExamine.csproj @@ -82,17 +82,57 @@ ..\Solution Items\TheFARM-Public.snk - - ..\packages\Examine.0.1.68.0\lib\Examine.dll + + ..\packages\Examine.2.0.0-beta8\lib\net45\Examine.dll True False ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - False - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Analyzers.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Core.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.FastVectorHighlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Highlighter.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Memory.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Queries.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Regex.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SimpleFacetedSearch.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.Snowball.dll + True + + + ..\packages\Lucene.Net.Contrib.3.0.3\lib\net40\Lucene.Net.Contrib.SpellChecker.dll + True diff --git a/src/UmbracoExamine/UmbracoExamineSearcher.cs b/src/UmbracoExamine/UmbracoExamineSearcher.cs index acbfefb180..f082a80327 100644 --- a/src/UmbracoExamine/UmbracoExamineSearcher.cs +++ b/src/UmbracoExamine/UmbracoExamineSearcher.cs @@ -133,12 +133,7 @@ namespace UmbracoExamine } #endregion - - /// - /// Used for unit tests - /// - internal static bool? DisableInitializationCheck = null; - + /// /// Returns true if the Umbraco application is in a state that we can initialize the examine indexes /// @@ -146,16 +141,12 @@ namespace UmbracoExamine protected bool CanInitialize() { - //check the DisableInitializationCheck and ensure that it is not set to true - if (!DisableInitializationCheck.HasValue || !DisableInitializationCheck.Value) + //We need to check if we actually can initialize, if not then don't continue + if (ApplicationContext.Current == null + || !ApplicationContext.Current.IsConfigured + || !ApplicationContext.Current.DatabaseContext.IsDatabaseConfigured) { - //We need to check if we actually can initialize, if not then don't continue - if (ApplicationContext.Current == null - || !ApplicationContext.Current.IsConfigured - || !ApplicationContext.Current.DatabaseContext.IsDatabaseConfigured) - { - return false; - } + return false; } return true; } @@ -168,8 +159,10 @@ namespace UmbracoExamine /// public override ISearchCriteria CreateSearchCriteria(string type, BooleanOperation defaultOperation) { - var criteria = base.CreateSearchCriteria(type, defaultOperation) as LuceneSearchCriteria; - criteria.NodeTypeAliasField = UmbracoContentIndexer.NodeTypeAliasFieldName; + throw new NotImplementedException("Fix strongly typed CreateSearchCriteria"); + + var criteria = base.CreateSearchCriteria(type, defaultOperation) as LuceneSearchCriteria; + //criteria.NodeTypeAliasField = UmbracoContentIndexer.NodeTypeAliasFieldName; return criteria; } @@ -185,56 +178,49 @@ namespace UmbracoExamine .Where(x => x != UmbracoContentIndexer.NodeTypeAliasFieldName) .ToArray(); } - - protected override IndexReader OpenNewReader() - { - var directory = GetLuceneDirectory(); - return IndexReader.Open( - directory, - //DeletePolicyTracker.Current.GetPolicy(directory), - true); - } - + protected override Lucene.Net.Store.Directory GetLuceneDirectory() { - //local temp storage is not enabled, just return the default - if (_localTempPath == null) return base.GetLuceneDirectory(); + throw new NotImplementedException("Fix local storage stuff"); - //local temp storage is enabled, configure the local directory instance - if (_localTempDirectory == null) - { - lock (Locker) - { - if (_localTempDirectory == null) - { - switch (_localStorageType) - { - case LocalStorageType.Sync: - var fsDir = base.GetLuceneDirectory() as FSDirectory; - if (fsDir != null) - { - _localTempDirectory = LocalTempStorageDirectoryTracker.Current.GetDirectory( - new DirectoryInfo(_localTempPath), - fsDir); - } - else - { - return base.GetLuceneDirectory(); - } - break; - case LocalStorageType.LocalOnly: - _localTempDirectory = DirectoryTracker.Current.GetDirectory(new DirectoryInfo(_localTempPath)); - break; - default: - throw new ArgumentOutOfRangeException(); - } + ////local temp storage is not enabled, just return the default + //if (_localTempPath == null) return base.GetLuceneDirectory(); + + ////local temp storage is enabled, configure the local directory instance + //if (_localTempDirectory == null) + //{ + // lock (Locker) + // { + // if (_localTempDirectory == null) + // { + // switch (_localStorageType) + // { + // case LocalStorageType.Sync: + // var fsDir = base.GetLuceneDirectory() as FSDirectory; + // if (fsDir != null) + // { + // _localTempDirectory = LocalTempStorageDirectoryTracker.Current.GetDirectory( + // new DirectoryInfo(_localTempPath), + // fsDir); + // } + // else + // { + // return base.GetLuceneDirectory(); + // } + // break; + // case LocalStorageType.LocalOnly: + // _localTempDirectory = DirectoryTracker.Current.GetDirectory(new DirectoryInfo(_localTempPath)); + // break; + // default: + // throw new ArgumentOutOfRangeException(); + // } - } - } - } + // } + // } + //} - return _localTempDirectory; + //return _localTempDirectory; } } } diff --git a/src/UmbracoExamine/XsltExtensions.cs b/src/UmbracoExamine/XsltExtensions.cs index abfe5cc555..019fa91975 100644 --- a/src/UmbracoExamine/XsltExtensions.cs +++ b/src/UmbracoExamine/XsltExtensions.cs @@ -5,6 +5,7 @@ using System.Security; using System.Xml.Linq; using System.Xml.XPath; using Examine; +using Examine.LuceneEngine; using Examine.LuceneEngine.Providers; using Examine.LuceneEngine.SearchCriteria; using Examine.SearchCriteria; @@ -32,7 +33,7 @@ namespace UmbracoExamine /// /// /// - internal static XPathNodeIterator Search(string searchText, bool useWildcards, BaseSearchProvider provider, string indexType) + internal static XPathNodeIterator Search(string searchText, bool useWildcards, LuceneSearcher provider, string indexType) { if (provider == null) throw new ArgumentNullException("provider"); @@ -50,7 +51,7 @@ namespace UmbracoExamine /// public static XPathNodeIterator Search(string searchText, bool useWildcards, string providerName, string indexType) { - var provider = ExamineManager.Instance.SearchProviderCollection[providerName]; + var provider = (LuceneSearcher)ExamineManager.Instance.SearchProviderCollection[providerName]; return Search(searchText, useWildcards, provider, indexType); } @@ -193,7 +194,7 @@ namespace UmbracoExamine /// /// The results. /// - private static XPathNodeIterator GetResultsAsXml(ISearchResults results) + private static XPathNodeIterator GetResultsAsXml(ILuceneSearchResults results) { // create the XDocument XDocument doc = new XDocument(); diff --git a/src/UmbracoExamine/app.config b/src/UmbracoExamine/app.config index 65f505d522..069bb69de3 100644 --- a/src/UmbracoExamine/app.config +++ b/src/UmbracoExamine/app.config @@ -30,6 +30,10 @@ + + + + diff --git a/src/UmbracoExamine/packages.config b/src/UmbracoExamine/packages.config index 722e13f2d5..2d46a0b8b9 100644 --- a/src/UmbracoExamine/packages.config +++ b/src/UmbracoExamine/packages.config @@ -1,6 +1,7 @@  - - + + + \ No newline at end of file