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
