From b6b80bad4368e2c6497e3c7840b31b31bf8bd7c8 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Sat, 5 Jan 2013 14:50:21 +0200 Subject: [PATCH] RavenDB-803 WhereIn when using an index --- Raven.Database/Indexing/Index.cs | 8 +-- .../LuceneIntegration/TermsMatchQuery.cs | 3 +- Raven.Database/Indexing/QueryBuilder.cs | 12 ++-- .../Indexing/RavenPerFieldAnalyzerWrapper.cs | 69 +++++++++++++++++++ Raven.Database/Indexing/SimpleQueryParser.cs | 2 +- .../Queries/MoreLikeThisQueryRunner.cs | 2 +- Raven.Database/Raven.Database.csproj | 1 + Raven.Tests/Indexes/UsingQueryBuilder.cs | 40 +++++------ Raven.Tests/Issues/RavenDB_626.cs | 2 +- Raven.Tests/MailingList/WhereInTests.cs | 37 +++++++++- 10 files changed, 139 insertions(+), 37 deletions(-) create mode 100644 Raven.Database/Indexing/RavenPerFieldAnalyzerWrapper.cs diff --git a/Raven.Database/Indexing/Index.cs b/Raven.Database/Indexing/Index.cs index ff95dde17ddc..55a749631f22 100644 --- a/Raven.Database/Indexing/Index.cs +++ b/Raven.Database/Indexing/Index.cs @@ -414,7 +414,7 @@ private void WriteTempIndexToDiskIfNeeded(WorkContext context) CreateIndexWriter(); } - public PerFieldAnalyzerWrapper CreateAnalyzer(Analyzer defaultAnalyzer, ICollection toDispose, bool forQuerying = false) + public RavenPerFieldAnalyzerWrapper CreateAnalyzer(Analyzer defaultAnalyzer, ICollection toDispose, bool forQuerying = false) { toDispose.Add(defaultAnalyzer.Close); @@ -424,7 +424,7 @@ public PerFieldAnalyzerWrapper CreateAnalyzer(Analyzer defaultAnalyzer, ICollect defaultAnalyzer = IndexingExtensions.CreateAnalyzerInstance(Constants.AllFields, value); toDispose.Add(defaultAnalyzer.Close); } - var perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(defaultAnalyzer); + var perFieldAnalyzerWrapper = new RavenPerFieldAnalyzerWrapper(defaultAnalyzer); foreach (var analyzer in indexDefinition.Analyzers) { Analyzer analyzerInstance = IndexingExtensions.CreateAnalyzerInstance(analyzer.Key, analyzer.Value); @@ -1020,7 +1020,7 @@ private Query GetLuceneQuery(string query, IndexQuery indexQuery) { logQuerying.Debug("Issuing query on index {0} for: {1}", parent.name, query); var toDispose = new List(); - PerFieldAnalyzerWrapper searchAnalyzer = null; + RavenPerFieldAnalyzerWrapper searchAnalyzer = null; try { searchAnalyzer = parent.CreateAnalyzer(new LowerCaseKeywordAnalyzer(), toDispose, true); @@ -1043,7 +1043,7 @@ private Query GetLuceneQuery(string query, IndexQuery indexQuery) return luceneQuery; } - private static void DisposeAnalyzerAndFriends(List toDispose, PerFieldAnalyzerWrapper analyzer) + private static void DisposeAnalyzerAndFriends(List toDispose, RavenPerFieldAnalyzerWrapper analyzer) { if (analyzer != null) analyzer.Close(); diff --git a/Raven.Database/Indexing/LuceneIntegration/TermsMatchQuery.cs b/Raven.Database/Indexing/LuceneIntegration/TermsMatchQuery.cs index dac3786c052f..19c823389bf6 100644 --- a/Raven.Database/Indexing/LuceneIntegration/TermsMatchQuery.cs +++ b/Raven.Database/Indexing/LuceneIntegration/TermsMatchQuery.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using Lucene.Net.Analysis; using Lucene.Net.Analysis.Tokenattributes; using Lucene.Net.Index; using Lucene.Net.Search; @@ -28,7 +27,7 @@ public string Field get { return field; } } - public TermsMatchQuery(string field, IEnumerable matches, PerFieldAnalyzerWrapper analyzer) + public TermsMatchQuery(string field, IEnumerable matches, RavenPerFieldAnalyzerWrapper analyzer) { this.field = field; this.matches = new List(); diff --git a/Raven.Database/Indexing/QueryBuilder.cs b/Raven.Database/Indexing/QueryBuilder.cs index da8a228bcd96..690feeae8501 100644 --- a/Raven.Database/Indexing/QueryBuilder.cs +++ b/Raven.Database/Indexing/QueryBuilder.cs @@ -25,18 +25,18 @@ public static class QueryBuilder static readonly Regex searchQuery = new Regex(@"([\w\d_]+?):\s*(\<\<.+?\>\>)(^[\d.]+)?", RegexOptions.Compiled | RegexOptions.Singleline); static readonly Regex dateQuery = new Regex(@"([\w\d_]+?):\s*(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{7}Z?)", RegexOptions.Compiled); - private static readonly Dictionary, PerFieldAnalyzerWrapper, Query>> queryMethods = new Dictionary, PerFieldAnalyzerWrapper, Query>>(StringComparer.InvariantCultureIgnoreCase) + private static readonly Dictionary, RavenPerFieldAnalyzerWrapper, Query>> queryMethods = new Dictionary, RavenPerFieldAnalyzerWrapper, Query>>(StringComparer.InvariantCultureIgnoreCase) { {"in", (field, args, analyzer) => new TermsMatchQuery(field, args, analyzer)}, {"emptyIn", (field, args, analyzer) => new TermsMatchQuery(field, Enumerable.Empty(), analyzer)} }; - public static Query BuildQuery(string query, PerFieldAnalyzerWrapper analyzer) + public static Query BuildQuery(string query, RavenPerFieldAnalyzerWrapper analyzer) { return BuildQuery(query, new IndexQuery(), analyzer); } - public static Query BuildQuery(string query, IndexQuery indexQuery, PerFieldAnalyzerWrapper analyzer) + public static Query BuildQuery(string query, IndexQuery indexQuery, RavenPerFieldAnalyzerWrapper analyzer) { var originalQuery = query; try @@ -64,7 +64,7 @@ public static Query BuildQuery(string query, IndexQuery indexQuery, PerFieldAnal } } - private static Query HandleMethods(Query query, PerFieldAnalyzerWrapper analyzer) + private static Query HandleMethods(Query query, RavenPerFieldAnalyzerWrapper analyzer) { var termQuery = query as TermQuery; if (termQuery != null && termQuery.Term.Field.StartsWith("@")) @@ -110,9 +110,9 @@ private static Query HandleMethods(Query query, PerFieldAnalyzerWrapper analyzer private static Regex unescapedSplitter = new Regex("(?, PerFieldAnalyzerWrapper, Query> value; + Func, RavenPerFieldAnalyzerWrapper, Query> value; var indexOfFieldStart = term.Field.IndexOf('<'); var indexOfFieldEnd = term.Field.LastIndexOf('>'); if (indexOfFieldStart == -1 || indexOfFieldEnd == -1) diff --git a/Raven.Database/Indexing/RavenPerFieldAnalyzerWrapper.cs b/Raven.Database/Indexing/RavenPerFieldAnalyzerWrapper.cs new file mode 100644 index 000000000000..fa9977eca7ce --- /dev/null +++ b/Raven.Database/Indexing/RavenPerFieldAnalyzerWrapper.cs @@ -0,0 +1,69 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Hibernating Rhinos LTD. All rights reserved. +// +// ----------------------------------------------------------------------- +using System.Collections.Generic; +using Lucene.Net.Analysis; +using Lucene.Net.Documents; +using System.Linq; + +namespace Raven.Database.Indexing +{ + public sealed class RavenPerFieldAnalyzerWrapper : Analyzer + { + private readonly Analyzer defaultAnalyzer; + private readonly IDictionary analyzerMap = new Dictionary(); + + public RavenPerFieldAnalyzerWrapper(Analyzer defaultAnalyzer) + { + this.defaultAnalyzer = defaultAnalyzer; + } + + public void AddAnalyzer(System.String fieldName, Analyzer analyzer) + { + analyzerMap[fieldName] = analyzer; + } + + public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) + { + return GetAnalyzer(fieldName).TokenStream(fieldName, reader); + } + + private Analyzer GetAnalyzer(string fieldName) + { + if (fieldName.StartsWith("@")) + { + var indexOfFieldStart = fieldName.IndexOf('<'); + var indexOfFieldEnd = fieldName.LastIndexOf('>'); + if (indexOfFieldStart != -1 && indexOfFieldEnd != -1) + { + fieldName = fieldName.Substring(indexOfFieldStart + 1, indexOfFieldEnd - indexOfFieldStart - 1); + } + } + Analyzer value; + analyzerMap.TryGetValue(fieldName, out value); + return value ?? defaultAnalyzer; + } + + public override TokenStream ReusableTokenStream(string fieldName, System.IO.TextReader reader) + { + return GetAnalyzer(fieldName).ReusableTokenStream(fieldName, reader); + } + + public override int GetPositionIncrementGap(string fieldName) + { + return GetAnalyzer(fieldName).GetPositionIncrementGap(fieldName); + } + + public override int GetOffsetGap(IFieldable field) + { + return GetAnalyzer(field.Name).GetOffsetGap(field); + } + + public override System.String ToString() + { + return "PerFieldAnalyzerWrapper(" + string.Join(",", analyzerMap.Select(x => x.Key + " -> " + x.Value)) + ", default=" + defaultAnalyzer + ")"; + } + } +} \ No newline at end of file diff --git a/Raven.Database/Indexing/SimpleQueryParser.cs b/Raven.Database/Indexing/SimpleQueryParser.cs index 4b25c232e879..fee96e44d1d1 100644 --- a/Raven.Database/Indexing/SimpleQueryParser.cs +++ b/Raven.Database/Indexing/SimpleQueryParser.cs @@ -19,7 +19,7 @@ namespace Raven.Database.Indexing { public class SimpleQueryParser { - static readonly PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(new KeywordAnalyzer()); + static readonly RavenPerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new RavenPerFieldAnalyzerWrapper(new KeywordAnalyzer()); public static HashSet GetFields(IndexQuery query) { diff --git a/Raven.Database/Queries/MoreLikeThisQueryRunner.cs b/Raven.Database/Queries/MoreLikeThisQueryRunner.cs index ea2250a63bea..75984908ffa1 100644 --- a/Raven.Database/Queries/MoreLikeThisQueryRunner.cs +++ b/Raven.Database/Queries/MoreLikeThisQueryRunner.cs @@ -90,7 +90,7 @@ public MoreLikeThisQueryResult ExecuteMoreLikeThisQuery(MoreLikeThisQuery query, mlt.SetFieldNames(fieldNames); var toDispose = new List(); - PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = null; + RavenPerFieldAnalyzerWrapper perFieldAnalyzerWrapper = null; try { perFieldAnalyzerWrapper = index.CreateAnalyzer(new LowerCaseKeywordAnalyzer(), toDispose, true); diff --git a/Raven.Database/Raven.Database.csproj b/Raven.Database/Raven.Database.csproj index c1a0850cadb8..6e7131b29812 100644 --- a/Raven.Database/Raven.Database.csproj +++ b/Raven.Database/Raven.Database.csproj @@ -200,6 +200,7 @@ + diff --git a/Raven.Tests/Indexes/UsingQueryBuilder.cs b/Raven.Tests/Indexes/UsingQueryBuilder.cs index c2e2d270fda8..61e8af02ce77 100644 --- a/Raven.Tests/Indexes/UsingQueryBuilder.cs +++ b/Raven.Tests/Indexes/UsingQueryBuilder.cs @@ -20,7 +20,7 @@ public class UsingQueryBuilder [Fact] public void Can_parse_Analyzed_simple_single_term() { - var query = QueryBuilder.BuildQuery("Name:SingleTerm", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:SingleTerm", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:singleterm", query.ToString()); Assert.True(query is TermQuery); @@ -31,7 +31,7 @@ public void Can_parse_Analyzed_simple_single_term() [Fact] public void Can_parse_Analyzed_simple_phrase() { - var query = QueryBuilder.BuildQuery("Name:\"Simple Phrase\"", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:\"Simple Phrase\"", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:\"simple phrase\"", query.ToString()); Assert.True(query is PhraseQuery); @@ -45,7 +45,7 @@ public void Can_parse_Analyzed_simple_phrase() [Fact] public void Can_parse_Analyzed_escaped_phrase() { - var query = QueryBuilder.BuildQuery("Name:\"Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase\"", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:\"Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase\"", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:\"escaped phrase\"", query.ToString()); Assert.True(query is PhraseQuery); @@ -59,7 +59,7 @@ public void Can_parse_Analyzed_escaped_phrase() [Fact] public void Can_parse_NotAnalyzed_simple_single_term() { - var query = QueryBuilder.BuildQuery("Name:[[SingleTerm]]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:[[SingleTerm]]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:SingleTerm", query.ToString()); Assert.True(query is TermQuery); @@ -70,7 +70,7 @@ public void Can_parse_NotAnalyzed_simple_single_term() [Fact] public void Can_parse_NotAnalyzed_simple_phrase() { - var query = QueryBuilder.BuildQuery("Name:[[\"Simple Phrase\"]]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:[[\"Simple Phrase\"]]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:Simple Phrase", query.ToString()); Assert.True(query is TermQuery); @@ -81,7 +81,7 @@ public void Can_parse_NotAnalyzed_simple_phrase() [Fact] public void Can_parse_NotAnalyzed_escaped_phrase() { - var query = QueryBuilder.BuildQuery("Name:[[Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase]]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Name:[[Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase]]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Name:Escaped+-&|!(){}[]^\"~*?:\\Phrase", query.ToString()); Assert.True(query is TermQuery); @@ -92,7 +92,7 @@ public void Can_parse_NotAnalyzed_escaped_phrase() [Fact] public void Can_parse_LessThan_on_date() { - var query = QueryBuilder.BuildQuery("Birthday:{NULL TO 20100515000000000}", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Birthday:{NULL TO 20100515000000000}", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Birthday:{* TO 20100515000000000}", query.ToString()); } @@ -100,7 +100,7 @@ public void Can_parse_LessThan_on_date() [Fact] public void Can_parse_LessThanOrEqual_on_date() { - var query = QueryBuilder.BuildQuery("Birthday:[NULL TO 20100515000000000]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Birthday:[NULL TO 20100515000000000]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Birthday:[* TO 20100515000000000]", query.ToString()); } @@ -108,7 +108,7 @@ public void Can_parse_LessThanOrEqual_on_date() [Fact] public void Can_parse_GreaterThan_on_int() { - var query = QueryBuilder.BuildQuery("Age_Range:{0x00000003 TO NULL}", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Age_Range:{0x00000003 TO NULL}", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Age_Range:{3 TO 2147483647}", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -117,7 +117,7 @@ public void Can_parse_GreaterThan_on_int() [Fact] public void Can_parse_GreaterThanOrEqual_on_int() { - var query = QueryBuilder.BuildQuery("Age_Range:[0x00000003 TO NULL]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Age_Range:[0x00000003 TO NULL]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Age_Range:[3 TO 2147483647]", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -126,7 +126,7 @@ public void Can_parse_GreaterThanOrEqual_on_int() [Fact] public void Can_parse_GreaterThanOrEqual_on_long() { - var query = QueryBuilder.BuildQuery("Age_Range:[0x0000000000000003 TO NULL]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Age_Range:[0x0000000000000003 TO NULL]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Age_Range:[3 TO 9223372036854775807]", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -135,7 +135,7 @@ public void Can_parse_GreaterThanOrEqual_on_long() [Fact] public void Can_parse_GreaterThanOrEqual_on_double() { - var query = QueryBuilder.BuildQuery("Price_Range:[Dx1.0 TO NULL]", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Price_Range:[Dx1.0 TO NULL]", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Price_Range:[1 TO 1" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "79769313486232E+308]", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -144,7 +144,7 @@ public void Can_parse_GreaterThanOrEqual_on_double() [Fact] public void Can_parse_LessThan_on_float() { - var query = QueryBuilder.BuildQuery("Price_Range:{NULL TO Fx1.0}", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("Price_Range:{NULL TO Fx1.0}", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("Price_Range:{-3" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "402823E+38 TO 1}", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -153,7 +153,7 @@ public void Can_parse_LessThan_on_float() [Fact] public void Can_parse_fixed_range_on_int() { - var query = QueryBuilder.BuildQuery("Age_Range:{0x00000003 TO 0x00000009}", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30))); + var query = QueryBuilder.BuildQuery("Age_Range:{0x00000003 TO 0x00000009}", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30))); Assert.Equal("Age_Range:{3 TO 9}", query.ToString()); Assert.True(query is NumericRangeQuery); @@ -162,7 +162,7 @@ public void Can_parse_fixed_range_on_int() [Fact] public void Can_parse_conjunctions_within_disjunction_query() { - var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" AND Name:SingleTerm) OR (Age:3 AND Birthday:20100515000000000)", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" AND Name:SingleTerm) OR (Age:3 AND Birthday:20100515000000000)", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("(+Name:\"simple phrase\" +Name:singleterm) (+Age:3 +Birthday:20100515000000000)", query.ToString()); } @@ -170,7 +170,7 @@ public void Can_parse_conjunctions_within_disjunction_query() [Fact] public void Can_parse_disjunctions_within_conjunction_query() { - var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" OR Name:SingleTerm) AND (Age:3 OR Birthday:20100515000000000)", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" OR Name:SingleTerm) AND (Age:3 OR Birthday:20100515000000000)", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("+(Name:\"simple phrase\" Name:singleterm) +(Age:3 Birthday:20100515000000000)", query.ToString()); } @@ -178,7 +178,7 @@ public void Can_parse_disjunctions_within_conjunction_query() [Fact] public void Can_parse_conjunctions_within_disjunction_query_with_int_range() { - var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" AND Name:SingleTerm) OR (Age_Range:{0x00000003 TO NULL} AND Birthday:20100515000000000)", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" AND Name:SingleTerm) OR (Age_Range:{0x00000003 TO NULL} AND Birthday:20100515000000000)", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("(+Name:\"simple phrase\" +Name:singleterm) (+Age_Range:{3 TO 2147483647} +Birthday:20100515000000000)", query.ToString()); } @@ -186,7 +186,7 @@ public void Can_parse_conjunctions_within_disjunction_query_with_int_range() [Fact] public void Can_parse_disjunctions_within_conjunction_query_with_date_range() { - var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" OR Name:SingleTerm) AND (Age_Range:3 OR Birthday:[NULL TO 20100515000000000])", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(Name:\"Simple Phrase\" OR Name:SingleTerm) AND (Age_Range:3 OR Birthday:[NULL TO 20100515000000000])", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("+(Name:\"simple phrase\" Name:singleterm) +(Age_Range:3 Birthday:[* TO 20100515000000000])", query.ToString()); } @@ -194,7 +194,7 @@ public void Can_parse_disjunctions_within_conjunction_query_with_date_range() [Fact] public void Can_parse_conjunctions_within_disjunction_query_with_NotAnalyzed_field() { - var query = QueryBuilder.BuildQuery("(AnalyzedName:\"Simple Phrase\" AND NotAnalyzedName:[[\"Simple Phrase\"]]) OR (Age_Range:3 AND Birthday:20100515000000000)", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(AnalyzedName:\"Simple Phrase\" AND NotAnalyzedName:[[\"Simple Phrase\"]]) OR (Age_Range:3 AND Birthday:20100515000000000)", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); // NOTE: this looks incorrect (looks like "Name:Simple OR DEFAULT_FIELD:Phrase") but internally it is a single phrase Assert.Equal("(+AnalyzedName:\"simple phrase\" +NotAnalyzedName:Simple Phrase) (+Age_Range:3 +Birthday:20100515000000000)", query.ToString()); @@ -203,7 +203,7 @@ public void Can_parse_conjunctions_within_disjunction_query_with_NotAnalyzed_fie [Fact] public void Can_parse_disjunctions_within_conjunction_query_with_escaped_field() { - var query = QueryBuilder.BuildQuery("(Name:\"Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase\" OR Name:SingleTerm) AND (Age_Range:3 OR Birthday:20100515000000000)", new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); + var query = QueryBuilder.BuildQuery("(Name:\"Escaped\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\\"\\~\\*\\?\\:\\\\Phrase\" OR Name:SingleTerm) AND (Age_Range:3 OR Birthday:20100515000000000)", new RavenPerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_29))); Assert.Equal("+(Name:\"escaped phrase\" Name:singleterm) +(Age_Range:3 Birthday:20100515000000000)", query.ToString()); } diff --git a/Raven.Tests/Issues/RavenDB_626.cs b/Raven.Tests/Issues/RavenDB_626.cs index a2a2b1344cf1..37048a983bf6 100644 --- a/Raven.Tests/Issues/RavenDB_626.cs +++ b/Raven.Tests/Issues/RavenDB_626.cs @@ -68,7 +68,7 @@ public void QueryWithPhrase() private static Query Parse(string q) { using (var defaultAnalyzer = new KeywordAnalyzer()) - using (var perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(defaultAnalyzer)) + using (var perFieldAnalyzerWrapper = new RavenPerFieldAnalyzerWrapper(defaultAnalyzer)) return QueryBuilder.BuildQuery(q, perFieldAnalyzerWrapper); } } diff --git a/Raven.Tests/MailingList/WhereInTests.cs b/Raven.Tests/MailingList/WhereInTests.cs index 7e723510b524..78db1bdea19e 100644 --- a/Raven.Tests/MailingList/WhereInTests.cs +++ b/Raven.Tests/MailingList/WhereInTests.cs @@ -9,6 +9,28 @@ namespace Raven.Tests.MailingList { public class WhereInTests : RavenTest { + [Fact] + public void WhereIn_using_index_notAnalyzed() + { + using (IDocumentStore documentStore = NewDocumentStore()) + { + new PersonsNotAnalyzed().Execute(documentStore); + + string[] names = { "Person One", "PersonTwo" }; + + StoreObjects(new List + { + new Person {Name = names[0]}, + new Person {Name = names[1]} + }, documentStore); + + using (var session = documentStore.OpenSession()) + { + var query = session.Advanced.LuceneQuery().WhereIn(p => p.Name, names); + Assert.Equal(2, query.ToList().Count()); // Expected 2 but was 0 + } + } + } [Fact] public void WhereIn_using_index_analyzed() { @@ -16,7 +38,7 @@ public void WhereIn_using_index_analyzed() { new PersonsAnalyzed().Execute(documentStore); - string[] names = {"Person One", "PersonTwo"}; + string[] names = { "Person One", "PersonTwo" }; StoreObjects(new List { @@ -38,7 +60,7 @@ public void WhereIn_not_using_index() using (IDocumentStore documentStore = NewDocumentStore()) { - string[] names = {"Person One", "PersonTwo"}; + string[] names = { "Person One", "PersonTwo" }; StoreObjects(new List { @@ -73,6 +95,17 @@ public class Person public string Name { get; set; } } + public class PersonsNotAnalyzed : AbstractIndexCreationTask + { + public PersonsNotAnalyzed() + { + Map = organizations => from o in organizations + select new { o.Name }; + + Indexes.Add(x => x.Name, FieldIndexing.NotAnalyzed); + } + } + public class PersonsAnalyzed : AbstractIndexCreationTask { public PersonsAnalyzed()