You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2019/08/13 09:12:14 UTC

[lucenenet] branch master updated: BUG: PerFieldAnalyzerWrapper and PerFieldReuseStrategy must support null keys (fixes LUCENENET-615)

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git


The following commit(s) were added to refs/heads/master by this push:
     new 09c073b  BUG: PerFieldAnalyzerWrapper and PerFieldReuseStrategy must support null keys (fixes LUCENENET-615)
09c073b is described below

commit 09c073ba8db9e8204694481da449b7b0d2a66018
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Tue Aug 13 16:11:27 2019 +0700

    BUG: PerFieldAnalyzerWrapper and PerFieldReuseStrategy must support null keys (fixes LUCENENET-615)
---
 .../Analysis/Miscellaneous/PerFieldAnalyzerWrapper.cs |  9 ++++-----
 .../Miscellaneous/TestPerFieldAnalyzerWrapper.cs      | 19 +++++++++++++++++++
 src/Lucene.Net/Analysis/Analyzer.cs                   |  4 +++-
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PerFieldAnalyzerWrapper.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PerFieldAnalyzerWrapper.cs
index 862f2a2..0d42889 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PerFieldAnalyzerWrapper.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PerFieldAnalyzerWrapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using Lucene.Net.Support;
+using System.Collections.Generic;
 
 namespace Lucene.Net.Analysis.Miscellaneous
 {
@@ -71,14 +72,12 @@ namespace Lucene.Net.Analysis.Miscellaneous
             : base(PER_FIELD_REUSE_STRATEGY)
         {
             this.defaultAnalyzer = defaultAnalyzer;
-            this.fieldAnalyzers = fieldAnalyzers ?? new Dictionary<string, Analyzer>();
+            this.fieldAnalyzers = fieldAnalyzers ?? new HashMap<string, Analyzer>(); // LUCENENET-615: Must support nullable keys
         }
 
         protected override Analyzer GetWrappedAnalyzer(string fieldName)
         {
-            Analyzer analyzer = fieldAnalyzers.ContainsKey(fieldName) ?
-                fieldAnalyzers[fieldName] :
-                null;
+            fieldAnalyzers.TryGetValue(fieldName, out Analyzer analyzer);
             return analyzer ?? defaultAnalyzer;
         }
 
diff --git a/src/Lucene.Net.Tests.Analysis.Common/Analysis/Miscellaneous/TestPerFieldAnalyzerWrapper.cs b/src/Lucene.Net.Tests.Analysis.Common/Analysis/Miscellaneous/TestPerFieldAnalyzerWrapper.cs
index 7429429..103d44d 100644
--- a/src/Lucene.Net.Tests.Analysis.Common/Analysis/Miscellaneous/TestPerFieldAnalyzerWrapper.cs
+++ b/src/Lucene.Net.Tests.Analysis.Common/Analysis/Miscellaneous/TestPerFieldAnalyzerWrapper.cs
@@ -1,7 +1,10 @@
 using Lucene.Net.Analysis.Core;
+using Lucene.Net.Analysis.En;
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Attributes;
 using Lucene.Net.Util;
 using NUnit.Framework;
+using System;
 using System.Collections.Generic;
 using System.IO;
 
@@ -69,6 +72,22 @@ namespace Lucene.Net.Analysis.Miscellaneous
             }
         }
 
+        [Test, LuceneNetSpecific]
+        public virtual void TestLUCENENET615()
+        {
+            var english = new EnglishAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
+
+            var whitespace = new WhitespaceAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
+
+            var pf = new PerFieldAnalyzerWrapper(english, new Lucene.Net.Support.HashMap<string, Analyzer>() { { "foo", whitespace } });
+
+            var test1 = english.GetTokenStream(null, "test"); // Does not throw
+
+            var test2 = pf.GetTokenStream("", "test"); // works
+
+            Assert.DoesNotThrow(() => pf.GetTokenStream(null, "test"), "GetTokenStream should not throw NullReferenceException with a null key");
+        }
+
         [Test]
         public virtual void TestCharFilters()
         {
diff --git a/src/Lucene.Net/Analysis/Analyzer.cs b/src/Lucene.Net/Analysis/Analyzer.cs
index 1120fd2..192362b 100644
--- a/src/Lucene.Net/Analysis/Analyzer.cs
+++ b/src/Lucene.Net/Analysis/Analyzer.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
@@ -464,7 +465,8 @@ namespace Lucene.Net.Analysis
                 var componentsPerField = (IDictionary<string, TokenStreamComponents>)GetStoredValue(analyzer);
                 if (componentsPerField == null)
                 {
-                    componentsPerField = new Dictionary<string, TokenStreamComponents>();
+                    // LUCENENET-615: This needs to support nullable keys
+                    componentsPerField = new HashMap<string, TokenStreamComponents>();
                     SetStoredValue(analyzer, componentsPerField);
                 }
                 componentsPerField[fieldName] = components;