diff --git a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs index eba184fdf..850e08598 100644 --- a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs +++ b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs @@ -341,5 +341,32 @@ namespace Orchard.Tests.Modules.Indexing { Assert.That(_searchBuilder.WithField("tag-value", "tag").Count(), Is.EqualTo(1)); } + + + [Test] + public void ShouldReturnAllDocuments() { + _provider.CreateIndex("default"); + for(var i = 1; i<100;i++) { + _provider.Store("default", _provider.New(i).Add("term-id", i).Store()); + } + + Assert.That(_searchBuilder.Count(), Is.EqualTo(99)); + } + + [Test] + public void NoClauseButAFilter() { + _provider.CreateIndex("default"); + for (var i = 1; i < 50; i++) { + _provider.Store("default", _provider.New(i).Add("term-id", i / 10).Store()); + } + + Assert.That(_searchBuilder.Count(), Is.EqualTo(49)); + Assert.That(_searchBuilder.WithField("term-id", 0).ExactMatch().AsFilter().Count(), Is.EqualTo(9)); + Assert.That(_searchBuilder.WithField("term-id", 1).ExactMatch().AsFilter().Count(), Is.EqualTo(10)); + Assert.That(_searchBuilder.WithField("term-id", 2).ExactMatch().AsFilter().Count(), Is.EqualTo(10)); + Assert.That(_searchBuilder.WithField("term-id", 3).ExactMatch().AsFilter().Count(), Is.EqualTo(10)); + Assert.That(_searchBuilder.WithField("term-id", 4).ExactMatch().AsFilter().Count(), Is.EqualTo(10)); + } + } } diff --git a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs index 4b7bce28b..7f0565d13 100644 --- a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs +++ b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs @@ -217,29 +217,37 @@ namespace Lucene.Services { private Query CreateQuery() { CreatePendingClause(); - var query = new BooleanQuery(); + var booleanQuery = new BooleanQuery(); + Query resultQuery = booleanQuery; - foreach( var clause in _clauses) - query.Add(clause); - + if (_clauses.Count == 0) { + if (_filters.Count > 0) { // only filters applieds => transform to a boolean query + foreach (var clause in _filters) { + booleanQuery.Add(clause); + } - if ( query.Clauses().Count == 0 ) { // get all documents ? - query.Add(new TermRangeQuery("id", "0", "9", true, true), BooleanClause.Occur.SHOULD); + resultQuery = booleanQuery; + } + else { // search all documents, without filter or clause + resultQuery = new MatchAllDocsQuery(null); + } + } + else { + foreach (var clause in _clauses) + booleanQuery.Add(clause); + + if (_filters.Count > 0) { + var filter = new BooleanQuery(); + foreach (var clause in _filters) + filter.Add(clause); + var queryFilter = new QueryWrapperFilter(filter); + + resultQuery = new FilteredQuery(booleanQuery, queryFilter); + } } - Query finalQuery = query; - - if(_filters.Count > 0) { - var filter = new BooleanQuery(); - foreach( var clause in _filters) - filter.Add(clause); - var queryFilter = new QueryWrapperFilter(filter); - - finalQuery = new FilteredQuery(query, queryFilter); - } - - Logger.Debug("New search query: {0}", finalQuery.ToString()); - return finalQuery; + Logger.Debug("New search query: {0}", resultQuery.ToString()); + return resultQuery; } public IEnumerable Search() {