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 2021/07/24 19:00:38 UTC

[lucenenet] branch master updated (ddddf53 -> a130105)

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

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


    from ddddf53  Lucene.Net.Highligher.VectorHighlight.FieldPharseList: Fixed ambiguous Number reference.
     new 40ca6f8  Lucene.Net.Support: Factored out Number class in favor of using J2N's parsers and formatters
     new d50da0e  Lucene.Net.Highlighter: Implemented IFormattable and added culture-aware ToString() overload to WeightedPhraseInfo and WeightedFragInfo
     new 9de7ffc  BREAKING: Lucene.Net.Highlighter.VectorHiglight.ScoreOrderFragmentsBuilder.ScoreComparer: Implemented singleton pattern so the class can only be used via the Default property.
     new a130105  PERFORMANCE: Lucene.Net.Highlighter: Use RemoveAll() extension method rather than allocating separate collections to track which enumerated items to remove.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../VectorHighlight/BaseFragmentsBuilder.cs        |  68 +++++-------
 .../VectorHighlight/FieldFragList.cs               |  17 ++-
 .../VectorHighlight/FieldPhraseList.cs             |  14 ++-
 .../VectorHighlight/ScoreOrderFragmentsBuilder.cs  |   9 +-
 .../Surround/Query/SrndQuery.cs                    |   4 +-
 src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs   |   5 +-
 .../VectorHighlight/FieldPhraseListTest.cs         |  41 ++++----
 .../VectorHighlight/IndexTimeSynonymTest.cs        |  15 +--
 .../VectorHighlight/SimpleFragListBuilderTest.cs   |  41 ++++----
 .../VectorHighlight/SingleFragListBuilderTest.cs   |   5 +-
 .../VectorHighlight/WeightedFragListBuilderTest.cs |   3 +-
 src/Lucene.Net.Tests/Support/TestToStringUtils.cs  |   4 +-
 src/Lucene.Net/Index/SegmentInfos.cs               |   4 +-
 .../Search/Similarities/LMDirichletSimilarity.cs   |   7 +-
 .../Similarities/LMJelinekMercerSimilarity.cs      |   7 +-
 src/Lucene.Net/Support/Number.cs                   | 115 ---------------------
 src/Lucene.Net/Util/ToStringUtils.cs               |   3 +-
 17 files changed, 136 insertions(+), 226 deletions(-)
 delete mode 100644 src/Lucene.Net/Support/Number.cs

[lucenenet] 04/04: PERFORMANCE: Lucene.Net.Highlighter: Use RemoveAll() extension method rather than allocating separate collections to track which enumerated items to remove.

Posted by ni...@apache.org.
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

commit a13010517c0e91719734b4b5d47d7203991555a3
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Sat Jul 24 15:27:19 2021 +0700

    PERFORMANCE: Lucene.Net.Highlighter: Use RemoveAll() extension method rather than allocating separate collections to track which enumerated items to remove.
---
 .../VectorHighlight/BaseFragmentsBuilder.cs        | 68 +++++++++-------------
 1 file changed, 27 insertions(+), 41 deletions(-)

diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs
index a30035d..bd2735d 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/BaseFragmentsBuilder.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Documents;
+using J2N.Collections.Generic.Extensions;
+using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Search.Highlight;
 using Lucene.Net.Support;
@@ -9,6 +10,7 @@ using System.Text;
 using SubInfo = Lucene.Net.Search.VectorHighlight.FieldFragList.WeightedFragInfo.SubInfo;
 using Toffs = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo.Toffs;
 using WeightedFragInfo = Lucene.Net.Search.VectorHighlight.FieldFragList.WeightedFragInfo;
+using JCG = J2N.Collections.Generic;
 
 namespace Lucene.Net.Search.VectorHighlight
 {
@@ -300,55 +302,39 @@ namespace Lucene.Net.Search.VectorHighlight
                         fragEnd = fragInfo.EndOffset;
                     }
 
-                    // LUCENENET specific - track the fragInfo.SubInfos items to delete
-                    List<SubInfo> fragInfo_SubInfos_ToDelete = new List<SubInfo>();
+                    // LUCENENET NOTE: Instead of removing during iteration (which isn't allowed in .NET when using an IEnumerator),
+                    // We use the IList<T>.RemoveAll() extension method of J2N. This removal happens in a forward way, but since it
+                    // accepts a predicate, we can put in the rest of Lucene's logic without doing something expensive like keeping
+                    // track of the items to remove in a separate collection. In a nutshell, any time Lucene calls iterator.remove(),
+                    // we return true and any time it is skipped, we return false.
 
-                    List<SubInfo> subInfos = new List<SubInfo>();
+                    IList<SubInfo> subInfos = new JCG.List<SubInfo>();
                     float boost = 0.0f;  //  The boost of the new info will be the sum of the boosts of its SubInfos
-                    using (IEnumerator<SubInfo> subInfoIterator = fragInfo.SubInfos.GetEnumerator())
+                    fragInfo.SubInfos.RemoveAll((subInfo) =>
                     {
-                        while (subInfoIterator.MoveNext())
+                        IList<Toffs> toffsList = new JCG.List<Toffs>();
+                        subInfo.TermsOffsets.RemoveAll((toffs) =>
                         {
-                            SubInfo subInfo = subInfoIterator.Current;
-                            List<Toffs> toffsList = new List<Toffs>();
-
-
-                            using (IEnumerator<Toffs> toffsIterator = subInfo.TermsOffsets.GetEnumerator())
-                            {
-                                while (toffsIterator.MoveNext())
-                                {
-                                    Toffs toffs = toffsIterator.Current;
-                                    if (toffs.StartOffset >= fieldStart && toffs.EndOffset <= fieldEnd)
-                                    {
-
-                                        toffsList.Add(toffs);
-                                        //toffsIterator.Remove();
-                                    }
-                                }
-                            }
-                            if (toffsList.Count > 0)
+                            if (toffs.StartOffset >= fieldStart && toffs.EndOffset <= fieldEnd)
                             {
-                                // LUCENENET NOTE: Instead of removing during iteration (which isn't allowed in .NET when using an IEnumerator), 
-                                // we just remove the items at this point. We only get here if there are items to remove.
-                                subInfo.TermsOffsets.RemoveAll(toffsList);
-
-                                subInfos.Add(new SubInfo(subInfo.Text, toffsList, subInfo.Seqnum, subInfo.Boost));
-                                boost += subInfo.Boost;
-                            }
 
-                            if (subInfo.TermsOffsets.Count == 0)
-                            {
-                                //subInfoIterator.Remove();
-                                fragInfo_SubInfos_ToDelete.Add(subInfo);
+                                toffsList.Add(toffs);
+                                return true; // Remove
                             }
+                            return false;
+                        });
+                        if (toffsList.Count > 0)
+                        {
+                            subInfos.Add(new SubInfo(subInfo.Text, toffsList, subInfo.Seqnum, subInfo.Boost));
+                            boost += subInfo.Boost;
                         }
-                    }
-
-                    // LUCENENET specific - now that we are done iterating the loop, it is safe to delete
-                    // the items we earmarked. Note this is just a list of pointers, so it doens't consume
-                    // much RAM.
-                    fragInfo.SubInfos.RemoveAll(fragInfo_SubInfos_ToDelete);
 
+                        if (subInfo.TermsOffsets.Count == 0)
+                        {
+                            return true; // Remove
+                        }
+                        return false;
+                    });
 
                     WeightedFragInfo weightedFragInfo = new WeightedFragInfo(fragStart, fragEnd, subInfos, boost);
                     fieldNameToFragInfos[field.Name].Add(weightedFragInfo);

[lucenenet] 02/04: Lucene.Net.Highlighter: Implemented IFormattable and added culture-aware ToString() overload to WeightedPhraseInfo and WeightedFragInfo

Posted by ni...@apache.org.
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

commit d50da0e529536c93cc33402a833cdf32951b979f
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Sun Jul 11 21:48:43 2021 +0700

    Lucene.Net.Highlighter: Implemented IFormattable and added culture-aware ToString() overload to WeightedPhraseInfo and WeightedFragInfo
---
 .../VectorHighlight/FieldFragList.cs               | 18 +++++++---
 .../VectorHighlight/FieldPhraseList.cs             | 13 +++++--
 .../VectorHighlight/FieldPhraseListTest.cs         | 41 +++++++++++-----------
 .../VectorHighlight/IndexTimeSynonymTest.cs        | 15 ++++----
 .../VectorHighlight/SimpleFragListBuilderTest.cs   | 41 +++++++++++-----------
 .../VectorHighlight/SingleFragListBuilderTest.cs   |  5 +--
 .../VectorHighlight/WeightedFragListBuilderTest.cs |  3 +-
 7 files changed, 79 insertions(+), 57 deletions(-)

diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
index 6dce798..3be0baa 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Text;
 using Float = J2N.Numerics.Single;
 using Toffs = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo.Toffs;
@@ -57,7 +58,7 @@ namespace Lucene.Net.Search.VectorHighlight
         /// <summary>
         /// List of term offsets + weight for a frag info
         /// </summary>
-        public class WeightedFragInfo
+        public class WeightedFragInfo : IFormattable // LUCENENET specific - implemented IFormattable for floating point representations
         {
             private readonly IList<SubInfo> subInfos; // LUCENENET: marked readonly
             private readonly float totalBoost; // LUCENENET: marked readonly
@@ -82,15 +83,24 @@ namespace Lucene.Net.Search.VectorHighlight
 
             public override string ToString()
             {
+                return ToString(null);
+            }
+
+            // LUCENENET specific: allow formatting the boost in the current culture.
+
+            public virtual string ToString(IFormatProvider provider)
+            {
                 StringBuilder sb = new StringBuilder();
                 sb.Append("subInfos=(");
                 foreach (SubInfo si in subInfos)
                     sb.Append(si.ToString());
-                // LUCENENET: intentionally using current culture here
-                sb.Append(")/").Append(Float.ToString(totalBoost)).Append('(').Append(startOffset).Append(',').Append(endOffset).Append(')');
+                // LUCENENET: allow formatting in the current culture
+                sb.Append(")/").Append(Float.ToString(totalBoost, provider)).Append('(').Append(startOffset).Append(',').Append(endOffset).Append(')');
                 return sb.ToString();
             }
 
+            string IFormattable.ToString(string format, IFormatProvider provider) => ToString(provider);
+
             /// <summary>
             /// Represents the list of term offsets for some text
             /// </summary>
diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
index 5ec2f99..bfb464f 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
@@ -223,7 +223,7 @@ namespace Lucene.Net.Search.VectorHighlight
         /// <summary>
         /// Represents the list of term offsets and boost for some text
         /// </summary>
-        public class WeightedPhraseInfo : IComparable<WeightedPhraseInfo>
+        public class WeightedPhraseInfo : IComparable<WeightedPhraseInfo>, IFormattable // LUCENENET specific - implemented IFormattable for floating point representations
         {
             private readonly List<Toffs> termsOffsets;   // usually termsOffsets.size() == 1, // LUCENENET: marked readonly
                                                          // but if position-gap > 1 and slop > 0 then size() could be greater than 1
@@ -378,9 +378,14 @@ namespace Lucene.Net.Search.VectorHighlight
 
             public override string ToString()
             {
+                return ToString(null);
+            }
+
+            public virtual string ToString(IFormatProvider provider)
+            {
                 StringBuilder sb = new StringBuilder();
-                // LUCENENET: intentionally using current culture here
-                sb.Append(GetText()).Append('(').Append(Float.ToString(boost)).Append(")(");
+                // LUCENENET: allow passing culture
+                sb.Append(GetText()).Append('(').Append(Float.ToString(boost, provider)).Append(")(");
                 foreach (Toffs to in termsOffsets)
                 {
                     sb.Append(to);
@@ -389,6 +394,8 @@ namespace Lucene.Net.Search.VectorHighlight
                 return sb.ToString();
             }
 
+            string IFormattable.ToString(string format, IFormatProvider provider) => ToString(provider);
+
             /// <summary>
             /// the seqnum
             /// </summary>
diff --git a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/FieldPhraseListTest.cs b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/FieldPhraseListTest.cs
index 477cd55..bc2e17a 100644
--- a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/FieldPhraseListTest.cs
+++ b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/FieldPhraseListTest.cs
@@ -2,6 +2,7 @@
 using NUnit.Framework;
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using TermInfo = Lucene.Net.Search.VectorHighlight.FieldTermStack.TermInfo;
 using Toffs = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo.Toffs;
 using WeightedPhraseInfo = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo;
@@ -36,7 +37,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("a(1.0)((0,1))", fpl.PhraseList[0].toString());
+            assertEquals("a(1.0)((0,1))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             fq = new FieldQuery(tq("b"), true, true);
             stack = new FieldTermStack(reader, 0, F, fq);
@@ -53,8 +54,8 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(2, fpl.PhraseList.size());
-            assertEquals("a(1.0)((0,1))", fpl.PhraseList[0].toString());
-            assertEquals("a(1.0)((2,3))", fpl.PhraseList[1].toString());
+            assertEquals("a(1.0)((0,1))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("a(1.0)((2,3))", fpl.PhraseList[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -66,13 +67,13 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("ab(1.0)((0,3))", fpl.PhraseList[0].toString());
+            assertEquals("ab(1.0)((0,3))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             fq = new FieldQuery(tq("b"), true, true);
             stack = new FieldTermStack(reader, 0, F, fq);
             fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("b(1.0)((2,3))", fpl.PhraseList[0].toString());
+            assertEquals("b(1.0)((2,3))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -87,7 +88,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("baac(1.0)((2,5))", fpl.PhraseList[0].toString());
+            assertEquals("baac(1.0)((2,5))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -102,8 +103,8 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(2, fpl.PhraseList.size());
-            assertEquals("ab(1.0)((0,2))", fpl.PhraseList[0].toString());
-            assertEquals("ab(1.0)((2,4))", fpl.PhraseList[1].toString());
+            assertEquals("ab(1.0)((0,2))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("ab(1.0)((2,4))", fpl.PhraseList[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -116,15 +117,15 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("ab(1.0)((4,7))", fpl.PhraseList[0].toString());
+            assertEquals("ab(1.0)((4,7))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             // phraseHighlight = false
             fq = new FieldQuery(pqF("a", "b"), false, true);
             stack = new FieldTermStack(reader, 0, F, fq);
             fpl = new FieldPhraseList(stack, fq);
             assertEquals(2, fpl.PhraseList.size());
-            assertEquals("a(1.0)((2,3))", fpl.PhraseList[0].toString());
-            assertEquals("ab(1.0)((4,7))", fpl.PhraseList[1].toString());
+            assertEquals("a(1.0)((2,3))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("ab(1.0)((4,7))", fpl.PhraseList[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -136,7 +137,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("ac(2.0)((4,5)(8,9))", fpl.PhraseList[0].toString());
+            assertEquals("ac(2.0)((4,5)(8,9))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(4, fpl.PhraseList[0].StartOffset);
             assertEquals(9, fpl.PhraseList[0].EndOffset);
         }
@@ -153,7 +154,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("abc(1.0)((2,7))", fpl.PhraseList[0].toString());
+            assertEquals("abc(1.0)((2,7))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -165,7 +166,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("abc(1.0)((6,11))", fpl.PhraseList[0].toString());
+            assertEquals("abc(1.0)((6,11))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -180,8 +181,8 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(2, fpl.PhraseList.size());
-            assertEquals("ab(1.0)((2,5))", fpl.PhraseList[0].toString());
-            assertEquals("abc(1.0)((10,15))", fpl.PhraseList[1].toString());
+            assertEquals("ab(1.0)((2,5))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("abc(1.0)((10,15))", fpl.PhraseList[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -193,7 +194,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("d(1.0)((9,10))", fpl.PhraseList[0].toString());
+            assertEquals("d(1.0)((9,10))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -205,8 +206,8 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(2, fpl.PhraseList.size());
-            assertEquals("searchengines(1.0)((102,116))", fpl.PhraseList[0].toString());
-            assertEquals("searchengines(1.0)((157,171))", fpl.PhraseList[1].toString());
+            assertEquals("searchengines(1.0)((102,116))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("searchengines(1.0)((157,171))", fpl.PhraseList[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -218,7 +219,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("sppeeeed(1.0)((88,93))", fpl.PhraseList[0].toString());
+            assertEquals("sppeeeed(1.0)((88,93))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         /* This test shows a big speedup from limiting the number of analyzed phrases in 
diff --git a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/IndexTimeSynonymTest.cs b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/IndexTimeSynonymTest.cs
index 5cc625b..d58ae36 100644
--- a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/IndexTimeSynonymTest.cs
+++ b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/IndexTimeSynonymTest.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Analysis.TokenAttributes;
 using NUnit.Framework;
 using System;
+using System.Globalization;
 using System.IO;
 using TermInfo = Lucene.Net.Search.VectorHighlight.FieldTermStack.TermInfo;
 
@@ -167,7 +168,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("personalcomputer(1.0)((3,5))", fpl.PhraseList[0].toString());
+            assertEquals("personalcomputer(1.0)((3,5))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(5, fpl.PhraseList[0].EndOffset);
         }
@@ -181,7 +182,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("computer(1.0)((3,5))", fpl.PhraseList[0].toString());
+            assertEquals("computer(1.0)((3,5))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(5, fpl.PhraseList[0].EndOffset);
         }
@@ -198,7 +199,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertTrue(fpl.PhraseList[0].toString().IndexOf("(1.0)((3,5))", StringComparison.Ordinal) > 0);
+            assertTrue(fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture).IndexOf("(1.0)((3,5))", StringComparison.Ordinal) > 0); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(5, fpl.PhraseList[0].EndOffset);
         }
@@ -212,7 +213,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("pc(1.0)((3,20))", fpl.PhraseList[0].toString());
+            assertEquals("pc(1.0)((3,20))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(20, fpl.PhraseList[0].EndOffset);
         }
@@ -226,7 +227,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("personalcomputer(1.0)((3,20))", fpl.PhraseList[0].toString());
+            assertEquals("personalcomputer(1.0)((3,20))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(20, fpl.PhraseList[0].EndOffset);
         }
@@ -240,7 +241,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertEquals("computer(1.0)((3,20))", fpl.PhraseList[0].toString());
+            assertEquals("computer(1.0)((3,20))", fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(20, fpl.PhraseList[0].EndOffset);
         }
@@ -257,7 +258,7 @@ namespace Lucene.Net.Search.VectorHighlight
             FieldTermStack stack = new FieldTermStack(reader, 0, F, fq);
             FieldPhraseList fpl = new FieldPhraseList(stack, fq);
             assertEquals(1, fpl.PhraseList.size());
-            assertTrue(fpl.PhraseList[0].toString().IndexOf("(1.0)((3,20))", StringComparison.Ordinal) > 0);
+            assertTrue(fpl.PhraseList[0].ToString(CultureInfo.InvariantCulture).IndexOf("(1.0)((3,20))", StringComparison.Ordinal) > 0); // LUCENENET specific: use invariant culture, since we are culture-aware
             assertEquals(3, fpl.PhraseList[0].StartOffset);
             assertEquals(20, fpl.PhraseList[0].EndOffset);
         }
diff --git a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SimpleFragListBuilderTest.cs b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SimpleFragListBuilderTest.cs
index 787aa8e..186184d 100644
--- a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SimpleFragListBuilderTest.cs
+++ b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SimpleFragListBuilderTest.cs
@@ -1,6 +1,7 @@
 using Lucene.Net.Index;
 using NUnit.Framework;
 using System;
+using System.Globalization;
 using Console = Lucene.Net.Util.SystemConsole;
 
 namespace Lucene.Net.Search.VectorHighlight
@@ -52,7 +53,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "abcdefghijklmnopqrs")), "abcdefghijklmnopqrs"), sflb.minFragCharSize);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(abcdefghijklmnopqrs((0,19)))/1.0(0,19)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(abcdefghijklmnopqrs((0,19)))/1.0(0,19)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -66,8 +67,8 @@ namespace Lucene.Net.Search.VectorHighlight
 
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(phraseQuery, "abcdefgh   jklmnopqrs"), sflb.minFragCharSize);
             assertEquals(1, ffl.FragInfos.size());
-            if (Verbose) Console.WriteLine(ffl.FragInfos[0].toString());
-            assertEquals("subInfos=(abcdefghjklmnopqrs((0,21)))/1.0(0,21)", ffl.FragInfos[0].toString());
+            if (Verbose) Console.WriteLine(ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("subInfos=(abcdefghjklmnopqrs((0,21)))/1.0(0,21)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -76,7 +77,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a"), 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1)))/1.0(0,100)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1)))/1.0(0,100)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -85,15 +86,15 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a a"), 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1))a((2,3)))/2.0(0,100)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1))a((2,3)))/2.0(0,100)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b b b b b b b b a"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1))a((18,19)))/2.0(0,20)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1))a((18,19)))/2.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "b b b b a b b b b a"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((8,9))a((18,19)))/2.0(4,24)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((8,9))a((18,19)))/2.0(4,24)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -102,18 +103,18 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b b b b b b b b b b b b b a"), 20);
             assertEquals(2, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].toString());
-            assertEquals("subInfos=(a((28,29)))/1.0(20,40)", ffl.FragInfos[1].toString());
+            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("subInfos=(a((28,29)))/1.0(20,40)", ffl.FragInfos[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b b b b b b b b b b b b a"), 20);
             assertEquals(2, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].toString());
-            assertEquals("subInfos=(a((26,27)))/1.0(20,40)", ffl.FragInfos[1].toString());
+            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("subInfos=(a((26,27)))/1.0(20,40)", ffl.FragInfos[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b b b b b b b b b a"), 20);
             assertEquals(2, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].toString());
-            assertEquals("subInfos=(a((20,21)))/1.0(20,40)", ffl.FragInfos[1].toString());
+            assertEquals("subInfos=(a((0,1)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
+            assertEquals("subInfos=(a((20,21)))/1.0(20,40)", ffl.FragInfos[1].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -130,11 +131,11 @@ namespace Lucene.Net.Search.VectorHighlight
 
             ffl = sflb.CreateFieldFragList(fpl(booleanQuery, "d b c"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(b((2,3)))/1.0(0,20)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(b((2,3)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             ffl = sflb.CreateFieldFragList(fpl(booleanQuery, "a b c"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1))b((2,3)))/2.0(0,20)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1))b((2,3)))/2.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -154,7 +155,7 @@ namespace Lucene.Net.Search.VectorHighlight
 
             ffl = sflb.CreateFieldFragList(fpl(phraseQuery, "a b c"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(ab((0,3)))/1.0(0,20)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(ab((0,3)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -169,7 +170,7 @@ namespace Lucene.Net.Search.VectorHighlight
 
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(phraseQuery, "a c b"), 20);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(ab((0,1)(4,5)))/1.0(0,20)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(ab((0,1)(4,5)))/1.0(0,20)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         private FieldPhraseList fpl(Query query, String indexValue)
@@ -191,7 +192,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl, 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(d((9,10)))/1.0(0,100)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(d((9,10)))/1.0(0,100)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -205,7 +206,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl, 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(searchengines((102,116))searchengines((157,171)))/2.0(87,187)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(searchengines((102,116))searchengines((157,171)))/2.0(87,187)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -219,7 +220,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SimpleFragListBuilder sflb = new SimpleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl, 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(sppeeeed((88,93)))/1.0(41,141)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(sppeeeed((88,93)))/1.0(41,141)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
     }
 }
diff --git a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SingleFragListBuilderTest.cs b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SingleFragListBuilderTest.cs
index f487ab6..9f46041 100644
--- a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SingleFragListBuilderTest.cs
+++ b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/SingleFragListBuilderTest.cs
@@ -1,6 +1,7 @@
 using Lucene.Net.Index;
 using NUnit.Framework;
 using System;
+using System.Globalization;
 
 namespace Lucene.Net.Search.VectorHighlight
 {
@@ -37,7 +38,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SingleFragListBuilder sflb = new SingleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b c d"), 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1)))/1.0(0,2147483647)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1)))/1.0(0,2147483647)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         [Test]
@@ -46,7 +47,7 @@ namespace Lucene.Net.Search.VectorHighlight
             SingleFragListBuilder sflb = new SingleFragListBuilder();
             FieldFragList ffl = sflb.CreateFieldFragList(fpl(new TermQuery(new Term(F, "a")), "a b c d", "a b c d e f g h i", "j k l m n o p q r s t u v w x y z a b c", "d e f g"), 100);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals("subInfos=(a((0,1))a((8,9))a((60,61)))/3.0(0,2147483647)", ffl.FragInfos[0].toString());
+            assertEquals("subInfos=(a((0,1))a((8,9))a((60,61)))/3.0(0,2147483647)", ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
         }
 
         private FieldPhraseList fpl(Query query, params String[] indexValues)
diff --git a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/WeightedFragListBuilderTest.cs b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/WeightedFragListBuilderTest.cs
index a666ef1..6787020 100644
--- a/src/Lucene.Net.Tests.Highlighter/VectorHighlight/WeightedFragListBuilderTest.cs
+++ b/src/Lucene.Net.Tests.Highlighter/VectorHighlight/WeightedFragListBuilderTest.cs
@@ -1,5 +1,6 @@
 using NUnit.Framework;
 using System;
+using System.Globalization;
 using SubInfo = Lucene.Net.Search.VectorHighlight.FieldFragList.WeightedFragInfo.SubInfo;
 using WeightedFragInfo = Lucene.Net.Search.VectorHighlight.FieldFragList.WeightedFragInfo;
 
@@ -55,7 +56,7 @@ namespace Lucene.Net.Search.VectorHighlight
             WeightedFragListBuilder wflb = new WeightedFragListBuilder();
             FieldFragList ffl = wflb.CreateFieldFragList(fpl, fragCharSize);
             assertEquals(1, ffl.FragInfos.size());
-            assertEquals(expectedFragInfo, ffl.FragInfos[0].toString());
+            assertEquals(expectedFragInfo, ffl.FragInfos[0].ToString(CultureInfo.InvariantCulture)); // LUCENENET specific: use invariant culture, since we are culture-aware
 
             float totalSubInfoBoost = 0;
             foreach (WeightedFragInfo info in ffl.FragInfos)

[lucenenet] 01/04: Lucene.Net.Support: Factored out Number class in favor of using J2N's parsers and formatters

Posted by ni...@apache.org.
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

commit 40ca6f8cd5cd2ac9062f713a5bd208ca3d560120
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Thu Jul 8 15:30:01 2021 +0700

    Lucene.Net.Support: Factored out Number class in favor of using J2N's parsers and formatters
---
 .../VectorHighlight/FieldFragList.cs               |   7 +-
 .../VectorHighlight/FieldPhraseList.cs             |   5 +-
 .../Surround/Query/SrndQuery.cs                    |   4 +-
 src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs   |   5 +-
 src/Lucene.Net.Tests/Support/TestToStringUtils.cs  |   4 +-
 src/Lucene.Net/Index/SegmentInfos.cs               |   4 +-
 .../Search/Similarities/LMDirichletSimilarity.cs   |   7 +-
 .../Similarities/LMJelinekMercerSimilarity.cs      |   7 +-
 src/Lucene.Net/Support/Number.cs                   | 115 ---------------------
 src/Lucene.Net/Util/ToStringUtils.cs               |   3 +-
 10 files changed, 28 insertions(+), 133 deletions(-)

diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
index 3c44972..6dce798 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/FieldFragList.cs
@@ -1,6 +1,6 @@
-using Lucene.Net.Support;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Text;
+using Float = J2N.Numerics.Single;
 using Toffs = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo.Toffs;
 using WeightedPhraseInfo = Lucene.Net.Search.VectorHighlight.FieldPhraseList.WeightedPhraseInfo;
 
@@ -86,7 +86,8 @@ namespace Lucene.Net.Search.VectorHighlight
                 sb.Append("subInfos=(");
                 foreach (SubInfo si in subInfos)
                     sb.Append(si.ToString());
-                sb.Append(")/").Append(Number.ToString(totalBoost)).Append('(').Append(startOffset).Append(',').Append(endOffset).Append(')');
+                // LUCENENET: intentionally using current culture here
+                sb.Append(")/").Append(Float.ToString(totalBoost)).Append('(').Append(startOffset).Append(',').Append(endOffset).Append(')');
                 return sb.ToString();
             }
 
diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
index f731181..5ec2f99 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/FieldPhraseList.cs
@@ -1,9 +1,9 @@
 using J2N.Numerics;
-using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 using System.Text;
+using Float = J2N.Numerics.Single;
 using QueryPhraseMap = Lucene.Net.Search.VectorHighlight.FieldQuery.QueryPhraseMap;
 using TermInfo = Lucene.Net.Search.VectorHighlight.FieldTermStack.TermInfo;
 
@@ -379,7 +379,8 @@ namespace Lucene.Net.Search.VectorHighlight
             public override string ToString()
             {
                 StringBuilder sb = new StringBuilder();
-                sb.Append(GetText()).Append('(').Append(Lucene.Net.Support.Number.ToString(boost)).Append(")(");
+                // LUCENENET: intentionally using current culture here
+                sb.Append(GetText()).Append('(').Append(Float.ToString(boost)).Append(")(");
                 foreach (Toffs to in termsOffsets)
                 {
                     sb.Append(to);
diff --git a/src/Lucene.Net.QueryParser/Surround/Query/SrndQuery.cs b/src/Lucene.Net.QueryParser/Surround/Query/SrndQuery.cs
index 1f62f4b..aa07cae 100644
--- a/src/Lucene.Net.QueryParser/Surround/Query/SrndQuery.cs
+++ b/src/Lucene.Net.QueryParser/Surround/Query/SrndQuery.cs
@@ -1,7 +1,9 @@
 using Lucene.Net.Search;
 using Lucene.Net.Support;
 using System;
+using System.Globalization;
 using System.Text;
+using Float = J2N.Numerics.Single;
 
 namespace Lucene.Net.QueryParsers.Surround.Query
 {
@@ -44,7 +46,7 @@ namespace Lucene.Net.QueryParsers.Surround.Query
             }
         }
 
-        public virtual string WeightString => Number.ToString(Weight);
+        public virtual string WeightString => Float.ToString(Weight, NumberFormatInfo.InvariantInfo);
 
         public virtual string WeightOperator => "^";
 
diff --git a/src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs b/src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs
index 9733c23..d6f585d 100644
--- a/src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs
+++ b/src/Lucene.Net.Sandbox/Queries/SlowFuzzyQuery.cs
@@ -1,11 +1,12 @@
 using J2N;
 using Lucene.Net.Index;
 using Lucene.Net.Search;
-using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Automaton;
 using System;
+using System.Globalization;
 using System.Text;
+using Float = J2N.Numerics.Single;
 
 namespace Lucene.Net.Sandbox.Queries
 {
@@ -165,7 +166,7 @@ namespace Lucene.Net.Sandbox.Queries
             }
             buffer.Append(m_term.Text);
             buffer.Append('~');
-            buffer.Append(Number.ToString(minimumSimilarity));
+            buffer.Append(Float.ToString(minimumSimilarity, NumberFormatInfo.InvariantInfo));
             buffer.Append(ToStringUtils.Boost(Boost));
             return buffer.ToString();
         }
diff --git a/src/Lucene.Net.Tests/Support/TestToStringUtils.cs b/src/Lucene.Net.Tests/Support/TestToStringUtils.cs
index 00c8412..d6869a0 100644
--- a/src/Lucene.Net.Tests/Support/TestToStringUtils.cs
+++ b/src/Lucene.Net.Tests/Support/TestToStringUtils.cs
@@ -1,4 +1,4 @@
-using Lucene.Net.Attributes;
+using Lucene.Net.Attributes;
 using Lucene.Net.Util;
 using NUnit.Framework;
 using System.Globalization;
@@ -73,7 +73,7 @@ namespace Lucene.Net.Support
                 assertEquals("", ToStringUtils.Boost(boostNormal));
                 assertEquals("^2.5", ToStringUtils.Boost(boostFractional));
                 assertEquals("^5.0", ToStringUtils.Boost(boostNonFractional));
-                assertEquals("^1.111111", ToStringUtils.Boost(boostLong));
+                assertEquals("^1.1111112", ToStringUtils.Boost(boostLong)); // LUCENENET: Confirmed this is the value returned in Java 7
                 assertEquals("^0.0", ToStringUtils.Boost(boostZeroNonFractional));
                 assertEquals("^0.123", ToStringUtils.Boost(boostZeroFractional));
             }
diff --git a/src/Lucene.Net/Index/SegmentInfos.cs b/src/Lucene.Net/Index/SegmentInfos.cs
index 48fe143..3426bfd 100644
--- a/src/Lucene.Net/Index/SegmentInfos.cs
+++ b/src/Lucene.Net/Index/SegmentInfos.cs
@@ -12,6 +12,7 @@ using System.Runtime.ExceptionServices;
 using System.Text;
 using System.Threading;
 using JCG = J2N.Collections.Generic;
+using Long = J2N.Numerics.Int64;
 
 namespace Lucene.Net.Index
 {
@@ -266,7 +267,8 @@ namespace Lucene.Net.Index
             }
             else if (fileName.StartsWith(IndexFileNames.SEGMENTS, StringComparison.Ordinal))
             {
-                return Number.Parse(fileName.Substring(1 + IndexFileNames.SEGMENTS.Length), Character.MaxRadix);
+                // LUCENENET: Optimized parse so we don't allocate a substring
+                return Long.Parse(fileName, 1 + IndexFileNames.SEGMENTS.Length, fileName.Length - (1 + IndexFileNames.SEGMENTS.Length), Character.MaxRadix);
             }
             else
             {
diff --git a/src/Lucene.Net/Search/Similarities/LMDirichletSimilarity.cs b/src/Lucene.Net/Search/Similarities/LMDirichletSimilarity.cs
index c36b467..669ff2d 100644
--- a/src/Lucene.Net/Search/Similarities/LMDirichletSimilarity.cs
+++ b/src/Lucene.Net/Search/Similarities/LMDirichletSimilarity.cs
@@ -1,6 +1,6 @@
-using Lucene.Net.Support;
-using System;
+using System;
 using System.Globalization;
+using Float = J2N.Numerics.Single;
 
 namespace Lucene.Net.Search.Similarities
 {
@@ -99,7 +99,8 @@ namespace Lucene.Net.Search.Similarities
 
         public override string GetName()
         {
-            return "Dirichlet(" + Number.ToString(Mu) + ")";
+            // LUCENENET: Intentionally using current culture
+            return "Dirichlet(" + Float.ToString(Mu) + ")";
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Search/Similarities/LMJelinekMercerSimilarity.cs b/src/Lucene.Net/Search/Similarities/LMJelinekMercerSimilarity.cs
index 0f6f99a..2b66b52 100644
--- a/src/Lucene.Net/Search/Similarities/LMJelinekMercerSimilarity.cs
+++ b/src/Lucene.Net/Search/Similarities/LMJelinekMercerSimilarity.cs
@@ -1,6 +1,6 @@
-using Lucene.Net.Support;
-using System;
+using System;
 using System.Globalization;
+using Float = J2N.Numerics.Single;
 
 namespace Lucene.Net.Search.Similarities
 {
@@ -75,7 +75,8 @@ namespace Lucene.Net.Search.Similarities
 
         public override string GetName()
         {
-            return "Jelinek-Mercer(" + Number.ToString(Lambda) + ")";
+            // LUCENENET: Intentionally using current culture
+            return "Jelinek-Mercer(" + Float.ToString(Lambda) + ")";
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Support/Number.cs b/src/Lucene.Net/Support/Number.cs
deleted file mode 100644
index 9aae78d..0000000
--- a/src/Lucene.Net/Support/Number.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-using System;
-using System.Globalization;
-
-namespace Lucene.Net.Support
-{
-    /// <summary>
-    /// A simple class for number conversions.
-    /// </summary>
-    internal static class Number
-    {
-        /// <summary>
-        /// Min radix value.
-        /// </summary>
-        public const int MIN_RADIX = 2;
-
-        /// <summary>
-        /// Max radix value.
-        /// </summary>
-        public const int MAX_RADIX = 36;
-
-        /*public const int CHAR_MIN_CODE_POINT =
-        public const int CHAR_MAX_CODE_POINT = */
-
-        private const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";
-
-        /// <summary>
-        /// Converts a number to System.String.
-        /// </summary>
-        /// <param name="f"></param>
-        /// <returns></returns>
-        public static System.String ToString(float f)
-        {
-            if (((float)(int)f) == f)
-            {
-                // Special case: When we have an integer value,
-                // the standard .NET formatting removes the decimal point
-                // and everything to the right. But we need to always
-                // have at least decimal place to match Lucene.
-                return f.ToString("0.0", CultureInfo.InvariantCulture);
-            }
-            else
-            {
-                // LUCENENET NOTE: Although the MSDN documentation says that 
-                // round-trip on float will be limited to 7 decimals, it appears
-                // not to be the case. Also, when specifying "0.0######", we only
-                // get a result to 6 decimal places maximum. So, we must round before
-                // doing a round-trip format to guarantee 7 decimal places.
-                return Math.Round(f, 7).ToString("R", CultureInfo.InvariantCulture);
-            }
-        }
-
-        /// <summary>
-        /// Parses a number in the specified radix.
-        /// </summary>
-        /// <param name="s">An input System.String.</param>
-        /// <param name="radix">A radix.</param>
-        /// <returns>The parsed number in the specified radix.</returns>
-        public static long Parse(System.String s, int radix)
-        {
-            if (s is null)
-            {
-                throw new ArgumentNullException(nameof(s));
-            }
-
-            if (radix < MIN_RADIX)
-            {
-                throw new NotSupportedException("radix " + radix +
-                                                " less than Number.MIN_RADIX");
-            }
-            if (radix > MAX_RADIX)
-            {
-                throw new NotSupportedException("radix " + radix +
-                                                " greater than Number.MAX_RADIX");
-            }
-
-            long result = 0;
-            long mult = 1;
-
-            s = s.ToLowerInvariant();
-
-            for (int i = s.Length - 1; i >= 0; i--)
-            {
-                int weight = digits.IndexOf(s[i]);
-                if (weight == -1)
-                    throw new FormatException("Invalid number for the specified radix");
-
-                result += (weight * mult);
-                mult *= radix;
-            }
-
-            return result;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/Lucene.Net/Util/ToStringUtils.cs b/src/Lucene.Net/Util/ToStringUtils.cs
index a53c093..e56c690 100644
--- a/src/Lucene.Net/Util/ToStringUtils.cs
+++ b/src/Lucene.Net/Util/ToStringUtils.cs
@@ -1,6 +1,7 @@
 using J2N.Numerics;
 using System.Globalization;
 using System.Text;
+using Float = J2N.Numerics.Single;
 
 namespace Lucene.Net.Util
 {
@@ -34,7 +35,7 @@ namespace Lucene.Net.Util
             if (boost != 1.0f)
             {
                 // .NET compatibility fix
-                return "^" + boost.ToString("0.0######", CultureInfo.InvariantCulture);
+                return "^" + Float.ToString(boost, CultureInfo.InvariantCulture);
             }
             else
                 return "";

[lucenenet] 03/04: BREAKING: Lucene.Net.Highlighter.VectorHiglight.ScoreOrderFragmentsBuilder.ScoreComparer: Implemented singleton pattern so the class can only be used via the Default property.

Posted by ni...@apache.org.
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

commit 9de7ffc14738efb6f0ba32e406abb2a9ea3c2e71
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Sun Jul 11 21:50:23 2021 +0700

    BREAKING: Lucene.Net.Highlighter.VectorHiglight.ScoreOrderFragmentsBuilder.ScoreComparer: Implemented singleton pattern so the class can only be used via the Default property.
---
 .../VectorHighlight/ScoreOrderFragmentsBuilder.cs                | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/Lucene.Net.Highlighter/VectorHighlight/ScoreOrderFragmentsBuilder.cs b/src/Lucene.Net.Highlighter/VectorHighlight/ScoreOrderFragmentsBuilder.cs
index 86ce070..82819a3 100644
--- a/src/Lucene.Net.Highlighter/VectorHighlight/ScoreOrderFragmentsBuilder.cs
+++ b/src/Lucene.Net.Highlighter/VectorHighlight/ScoreOrderFragmentsBuilder.cs
@@ -59,7 +59,7 @@ namespace Lucene.Net.Search.VectorHighlight
         /// </summary>
         public override IList<WeightedFragInfo> GetWeightedFragInfoList(IList<WeightedFragInfo> src)
         {
-            CollectionUtil.TimSort(src, new ScoreComparer());
+            CollectionUtil.TimSort(src, ScoreComparer.Default);
             return src;
         }
 
@@ -69,6 +69,13 @@ namespace Lucene.Net.Search.VectorHighlight
         /// </summary>
         public class ScoreComparer : IComparer<WeightedFragInfo>
         {
+            private ScoreComparer() { } // Singleton only
+
+            /// <summary>
+            /// Returns a default score comparer.
+            /// </summary>
+            public static IComparer<WeightedFragInfo> Default { get; } = new ScoreComparer(); // LUCENENET specific: use singleton pattern
+
             public virtual int Compare(WeightedFragInfo o1, WeightedFragInfo o2)
             {
                 if (o1.TotalBoost > o2.TotalBoost) return -1;