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 ae16f28253e725c6ff7f8993d4fcea95b8122180
Author: Semirk0 <[email protected]>
AuthorDate: Tue Nov 24 04:13:21 2020 +0100

    updating document overload and adding IFormattable implementation
---
 src/Lucene.Net.Misc/Document/LazyDocument.cs       | 25 +++++++-
 .../Index/TestIndexWriterExceptions.cs             |  5 --
 src/Lucene.Net.Tests/Index/TestIndexableField.cs   |  5 --
 src/Lucene.Net/Document/Document.cs                | 71 ++++++++++++----------
 src/Lucene.Net/Document/Field.cs                   | 52 ++++++++++------
 src/Lucene.Net/Index/IndexableField.cs             |  6 --
 src/Lucene.Net/Support/Document/Field.cs           |  2 +-
 7 files changed, 97 insertions(+), 69 deletions(-)

diff --git a/src/Lucene.Net.Misc/Document/LazyDocument.cs 
b/src/Lucene.Net.Misc/Document/LazyDocument.cs
index 92c886b..967353f 100644
--- a/src/Lucene.Net.Misc/Document/LazyDocument.cs
+++ b/src/Lucene.Net.Misc/Document/LazyDocument.cs
@@ -135,7 +135,7 @@ namespace Lucene.Net.Documents
         /// <summary>
         /// @lucene.internal 
         /// </summary>
-        public class LazyField : IIndexableField
+        public class LazyField : IIndexableField, IFormattable
         {
             private readonly LazyDocument outerInstance;
 
@@ -355,9 +355,30 @@ namespace Lucene.Net.Documents
                 return GetRealValue().GetTokenStream(analyzer);
             }
 
+            // LUCENENET specific - method added for better .NET compatibility
+            public override string ToString()
+                => ToString(null, J2N.Text.StringFormatter.CurrentCulture);
+
+            // LUCENENET specific - method added for better .NET compatibility
+            public virtual string ToString(string format)
+                => ToString(format, J2N.Text.StringFormatter.CurrentCulture);
+
+            // LUCENENET specific - method added for better .NET compatibility
             public virtual string ToString(IFormatProvider provider)
+                => ToString(null, provider);
+
+            // LUCENENET specific - method added for better .NET compatibility
+            public virtual string ToString(string format,IFormatProvider 
provider)
             {
-                return GetRealValue().ToString(provider);
+                IIndexableField realValue = GetRealValue();
+                if(realValue is IFormattable formattable)
+                {
+                    return formattable.ToString(format, provider);
+                }
+                else
+                {
+                    return realValue.ToString();
+                }
             }
         }
     }
diff --git a/src/Lucene.Net.Tests/Index/TestIndexWriterExceptions.cs 
b/src/Lucene.Net.Tests/Index/TestIndexWriterExceptions.cs
index 8833cb8..c9ca8a4 100644
--- a/src/Lucene.Net.Tests/Index/TestIndexWriterExceptions.cs
+++ b/src/Lucene.Net.Tests/Index/TestIndexWriterExceptions.cs
@@ -2043,11 +2043,6 @@ namespace Lucene.Net.Index
             {
                 return null;
             }
-
-            public virtual string ToString(IFormatProvider provider)
-            {
-                return GetStringValue().ToString(provider);
-            }
         }
 
         // See LUCENE-4870 TooManyOpenFiles errors are thrown as
diff --git a/src/Lucene.Net.Tests/Index/TestIndexableField.cs 
b/src/Lucene.Net.Tests/Index/TestIndexableField.cs
index 89e9efa..06b39ba 100644
--- a/src/Lucene.Net.Tests/Index/TestIndexableField.cs
+++ b/src/Lucene.Net.Tests/Index/TestIndexableField.cs
@@ -225,11 +225,6 @@ namespace Lucene.Net.Index
             {
                 return GetReaderValue() != null ? 
analyzer.GetTokenStream(Name, GetReaderValue()) : analyzer.GetTokenStream(Name, 
new StringReader(GetStringValue()));
             }
-
-            public virtual string ToString(IFormatProvider provider)
-            {
-                return GetStringValue().ToString(provider);
-            }
         }
 
         // Silly test showing how to index documents w/o using Lucene's core
diff --git a/src/Lucene.Net/Document/Document.cs 
b/src/Lucene.Net/Document/Document.cs
index 0f1a081..25098a9 100644
--- a/src/Lucene.Net/Document/Document.cs
+++ b/src/Lucene.Net/Document/Document.cs
@@ -38,7 +38,7 @@ namespace Lucene.Net.Documents
     /// <i>not</i> available in documents retrieved from the index, e.g. with 
     /// <see cref="Search.ScoreDoc.Doc"/> or <see 
cref="IndexReader.Document(int)"/>.
     /// </summary>
-    public sealed class Document : IEnumerable<IIndexableField>
+    public sealed class Document : IEnumerable<IIndexableField>, IFormattable
     {
         private readonly List<IIndexableField> fields = new 
List<IIndexableField>();
 
@@ -235,8 +235,8 @@ namespace Lucene.Net.Documents
             var result = new List<string>();
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue();
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue()) != null)
                 {
                     result.Add(fieldStringValue);
                 }
@@ -260,13 +260,14 @@ namespace Lucene.Net.Documents
         /// <param name="name"> the name of the field </param>
         /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
         /// <returns> a <see cref="T:string[]"/> of field values </returns>
+        // LUCENENET specific - method added for better .NET compatibility
         public string[] GetValues(string name, string format)
         {
             var result = new List<string>();
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(format);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(format)) != null)
                 {
                     result.Add(fieldStringValue);
                 }
@@ -290,13 +291,14 @@ namespace Lucene.Net.Documents
         /// <param name="name"> the name of the field </param>
         /// <param name = "provider" > An object that supplies 
culture-specific formatting information.This parameter has no effect if this 
field is non-numeric.</param>
         /// <returns> a <see cref="T:string[]"/> of field values </returns>
+        // LUCENENET specific - method added for better .NET compatibility
         public string[] GetValues(string name, IFormatProvider provider)
         {
             var result = new List<string>();
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(provider);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(provider)) != null)
                 {
                     result.Add(fieldStringValue);
                 }
@@ -321,13 +323,14 @@ namespace Lucene.Net.Documents
         /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
         /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
         /// <returns> a <see cref="T:string[]"/> of field values </returns>
+        // LUCENENET specific - method added for better .NET compatibility
         public string[] GetValues(string name, string format, IFormatProvider 
provider)
         {
             var result = new List<string>();
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(format, 
provider);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(format, provider)) != null)
                 {
                     result.Add(fieldStringValue);
                 }
@@ -354,8 +357,8 @@ namespace Lucene.Net.Documents
         {
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue();
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue()) != null)
                 {
                     return fieldStringValue;
                 }
@@ -373,12 +376,13 @@ namespace Lucene.Net.Documents
         /// the actual numeric field instance back, use <see 
cref="GetField(string)"/>.
         /// </summary>
         /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
         public string Get(string name, string format)
         {
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(format);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(format)) != null)
                 {
                     return fieldStringValue;
                 }
@@ -396,12 +400,13 @@ namespace Lucene.Net.Documents
         /// the actual numeric field instance back, use <see 
cref="GetField(string)"/>.
         /// </summary>
         /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
         public string Get(string name, IFormatProvider provider)
         {
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(provider);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(provider)) != null)
                 {
                     return fieldStringValue;
                 }
@@ -420,12 +425,13 @@ namespace Lucene.Net.Documents
         /// </summary>
         /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
         /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
         public string Get(string name, string format, IFormatProvider provider)
         {
             foreach (IIndexableField field in fields)
             {
-                string fieldStringValue = field.GetStringValue(format, 
provider);
-                if (field.Name.Equals(name, StringComparison.Ordinal) && 
fieldStringValue != null)
+                string fieldStringValue;
+                if (field.Name.Equals(name, StringComparison.Ordinal) && 
(fieldStringValue = field.GetStringValue(format, provider)) != null)
                 {
                     return fieldStringValue;
                 }
@@ -437,33 +443,36 @@ namespace Lucene.Net.Documents
         /// Prints the fields of a document for human consumption. </summary>
         public override string ToString()
         {
-            var buffer = new StringBuilder();
-            buffer.Append("Document<");
-            for (int i = 0; i < fields.Count; i++)
-            {
-                IIndexableField field = fields[i];
-                buffer.Append(field.ToString());
-                if (i != fields.Count - 1)
-                {
-                    buffer.Append(" ");
-                }
-            }
-            buffer.Append(">");
-            return buffer.ToString();
+            return (this as IFormattable).ToString(null, 
J2N.Text.StringFormatter.CurrentCulture);
         }
 
         /// <summary>
         /// Prints the fields of a document for human consumption. 
         /// </summary>
         /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
         public string ToString(IFormatProvider provider)
         {
+            return (this as IFormattable).ToString(null, provider);
+        }
+
+        /// <summary>
+        /// Prints the fields of a document for human consumption. 
+        /// </summary>
+        /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
+        /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
+        string IFormattable.ToString(string format, IFormatProvider provider)
+        {
             var buffer = new StringBuilder();
             buffer.Append("Document<");
             for (int i = 0; i < fields.Count; i++)
             {
                 IIndexableField field = fields[i];
-                buffer.Append(field.ToString(provider));
+                if (field is IFormattable formattable)
+                    buffer.Append(formattable.ToString(format, provider));
+                else
+                    buffer.Append(field.ToString());
                 if (i != fields.Count - 1)
                 {
                     buffer.Append(" ");
diff --git a/src/Lucene.Net/Document/Field.cs b/src/Lucene.Net/Document/Field.cs
index 801fcb4..b1fbe05 100644
--- a/src/Lucene.Net/Document/Field.cs
+++ b/src/Lucene.Net/Document/Field.cs
@@ -47,7 +47,7 @@ namespace Lucene.Net.Documents
     /// Field it is used in.  It is strongly recommended that no
     /// changes be made after <see cref="Field"/> instantiation.
     /// </summary>
-    public partial class Field : IIndexableField
+    public partial class Field : IIndexableField, IFormattable
     {
         /// <summary>
         /// Field's type
@@ -780,38 +780,52 @@ namespace Lucene.Net.Documents
         /// Prints a <see cref="Field"/> for human consumption. </summary>
         public override string ToString()
         {
-            StringBuilder result = new StringBuilder();
-            result.Append(m_type.ToString());
-            result.Append('<');
-            result.Append(m_name);
-            result.Append(':');
-
-            if (FieldsData != null)
-            {
-                result.Append(FieldsData);
-            }
+            return ToString(null, J2N.Text.StringFormatter.CurrentCulture);
+        }
 
-            result.Append('>');
-            return result.ToString();
+        /// <summary>
+        /// Prints a <see cref="Field"/> for human consumption. 
+        /// </summary>
+        /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
+        public virtual string ToString(string format)
+        {
+            return ToString(null, J2N.Text.StringFormatter.CurrentCulture);
         }
 
         /// <summary>
         /// Prints a <see cref="Field"/> for human consumption.
         /// </summary>
         /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
         public virtual string ToString(IFormatProvider provider)
         {
+            return ToString(null, J2N.Text.StringFormatter.CurrentCulture);
+        }
+
+        /// <summary>
+        /// Prints a <see cref="Field"/> for human consumption.
+        /// </summary>
+        /// <param name="format">A standard or custom numeric format string. 
This parameter has no effect if this field is non-numeric.</param>
+        /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
+        // LUCENENET specific - method added for better .NET compatibility
+        public virtual string ToString(string format, IFormatProvider provider)
+        {
             StringBuilder result = new StringBuilder();
+            result.Append(m_type.ToString());
+            result.Append('<');
+            result.Append(m_name);
+            result.Append(':');
 
-            if(FieldsData != null)
-            {
-                result.AppendFormat(provider, "{0}<{1}:{3}>", 
m_type.ToString(), m_name.ToString(), FieldsData);
-            }
-            else
+            if (FieldsData != null)
             {
-                result.AppendFormat(provider, "{0}<{1}:>", m_type.ToString(), 
m_name.ToString());
+                if (FieldsData is IFormattable formattable)
+                    result.Append(formattable.ToString(format, provider));
+                else
+                    result.Append(FieldsData.ToString());
             }
 
+            result.Append('>');
             return result.ToString();
         }
 
diff --git a/src/Lucene.Net/Index/IndexableField.cs 
b/src/Lucene.Net/Index/IndexableField.cs
index 93f0b75..18fc0ee 100644
--- a/src/Lucene.Net/Index/IndexableField.cs
+++ b/src/Lucene.Net/Index/IndexableField.cs
@@ -201,11 +201,5 @@ namespace Lucene.Net.Index
         ///         a non-null value if the field is to be indexed </returns>
         /// <exception cref="IOException"> Can be thrown while creating the 
<see cref="TokenStream"/> </exception>
         TokenStream GetTokenStream(Analyzer analyzer);
-
-        /// <summary>
-        /// Prints a <see cref="Field"/> for human consumption.
-        /// </summary>
-        /// <param name="provider">An object that supplies culture-specific 
formatting information. This parameter has no effect if this field is 
non-numeric.</param>
-        string ToString(IFormatProvider provider);
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Support/Document/Field.cs 
b/src/Lucene.Net/Support/Document/Field.cs
index b47b98e..1198aa9 100644
--- a/src/Lucene.Net/Support/Document/Field.cs
+++ b/src/Lucene.Net/Support/Document/Field.cs
@@ -29,7 +29,7 @@ namespace Lucene.Net.Documents
 #if FEATURE_SERIALIZABLE
         [Serializable]
 #endif
-        protected abstract class Number
+        protected abstract class Number : IFormattable
         {
             /// <summary>
             /// Returns this object's value as a <see cref="byte"/>. Might 
involve rounding and/or

Reply via email to