[
https://issues.apache.org/jira/browse/LUCENENET-616?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Shad Storhaug resolved LUCENENET-616.
-------------------------------------
Resolution: Fixed
All of these issues have been addressed except for {{ConditionalWeakTable<TKey,
TValue>}} (see LUCENENET-636).
> Make Collections from Lucene.Net.Support into a 1st Class Feature
> -----------------------------------------------------------------
>
> Key: LUCENENET-616
> URL: https://issues.apache.org/jira/browse/LUCENENET-616
> Project: Lucene.Net
> Issue Type: Improvement
> Components: Lucene.Net Core
> Affects Versions: Lucene.Net 4.8.0
> Reporter: Shad Storhaug
> Assignee: Shad Storhaug
> Priority: Major
> Fix For: Lucene.Net 4.8.0
>
> Attachments: NullableKey.cs, NullableKeyDictionary.cs
>
> Original Estimate: 60h
> Remaining Estimate: 60h
>
> The collection types in {{Lucene.Net.Support}} were originally sourced to
> support Lucene.Net itself. While they were made public, they were not
> considered to be features that would be used by anyone except for advanced
> users.
> However, it has become clear by user reports that some parts of Lucene's
> design require specialized collections that don't exist in the .NET Framework
> in order to properly function (see
> [LUCENENET-612|https://issues.apache.org/jira/projects/LUCENENET/issues/LUCENENET-612]
> and
> [LUCENENET-615|https://issues.apache.org/jira/projects/LUCENENET/issues/LUCENENET-615].
> .NET users are generally not familiar with these specialized collection
> types and assume that when {{IDictionary<TKey, TValue>}} is required by an
> API that using {{Dictionary<TKey, TValue>}} is their best choice. We need to
> improve documentation and increase visibility of the specialized collection
> types in order to help them along.
> Some of the existing collections are composed of other nested collection
> objects and should be replaced with a lower-level implementation, if
> possible. Since these are breaking API changes, they should be done before
> the official release of Lucene.Net 4.8.0.
> Additionally, many parts of Lucene.NET expect the collections to:
> * Be structurally equal
> * Format their contents in the ToString() method
> The safest and most thorough way to achieve this is to replace the usage of
> all built-in .NET collections with collections that we own that implement
> this functionality. .NET provides interfaces to help achieve this:
> * {{IStructuralEquatable}}
> * {{IFormattable}}
> But neither interface is implemented in any of the built-in collections in
> .NET.
> h2. *Requirements for Lucene.NET Collections*
> We must have the following collections for internal use within Lucene.NET,
> and each should also be made available to end users.
> * {{J2N.Collections.Generic.List<T>}}
> ** Subclass of {{System.Collections.Generic.List<T>}}
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.HashSet<T>}}
> ** Subclass of {{System.Collections.Generic.List<T>}}
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.SortedSet<T>}}
> ** Subclass of {{System.Collections.Generic.SortedSet<T>}}
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.Dictionary<TKey, TValue>}}
> ** Same interface as {{System.Collections.Generic.Dictionary<TKey, TValue>}}
> ** Supports null keys
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.SortedDictionary<TKey, TValue>}}
> ** Same interface as {{System.Collections.Generic.SortedDictionary<TKey,
> TValue>}}
> ** Supports null keys
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.LinkedDictionary<TKey, TValue>}}
> ** Same interface as {{System.Collections.Generic.Dictionary<TKey, TValue>}}
> ** Preserves insertion order across adds/deletes
> ** Supports null keys
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.PriorityQueue<T>}}
> ** Migrate {{Lucene.Net.Support.PriorityQueue<T>}} implementation, but clean
> up the API for .NET (AddAll() > AddRange(), etc.)
> * {{J2N.Collections.Generic.IdentityDictionary<TKey, TValue>}} (See
> {{Lucene.Net.Support.IdentityHashMap<TKey, TValue>}})
> ** Same interface as {{System.Collections.Generic.Dictionary<TKey, TValue>}}
> ** Supports null keys
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Collections.Generic.IdentityHashSet<T>}} (See
> {{Lucene.Net.Support.IdentityHashSet<T>}})
> ** Subclass of {{System.Collections.Generic.HashSet<T>}}
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{ConcurrentHashSet<T>}} - (See LUCENENET-634)
> We should have the following collections for internal use within Lucene.NET.
> * {{J2N.Collections.Generic.LinkedHashSet<T>}}
> ** Same interface as {{System.Collections.Generic.List<T>}}
> ** Preserves insertion order across adds/deletes
> ** Implements {{IStructuralEquatable}}
> ** Implements {{IFormattable}}
> * {{J2N.Runtime.CompilerServices.ConditionalWeakTable<TKey, TValue>}} (See
> LUCENENET-636)
> h3. *Special Cases*
> There are a few uses where the above collections won't suffice because they
> use low-level methods that don't exist in .NET collections. However, these
> are closed systems and we don't have to worry about supporting end users in
> these cases.
> * {{Lucene.Net.TestFramework.Analysis.MockCharFilter}} > Use C5's
> {{TreeDictionary<TKey, TValue}}
> * {{Lucene.Net.Grouping.AbstractGroupFacetCollector}} > Use C5's
> {{TreeSet<T>}}
> * {{Lucene.Net.Highlighter.PostingsHighlight.PostingsHighlighter}} > Use
> C5's {{TreeSet<T>}}
> Note that C5's {{TreeSet<T>}} does not currently support {{ISet<T>}}, and we
> will need to push our implementation of it back to them to support this
> change.
> h3. *Structural Equality*
> J2N has {{J2N.Collections.Generic.ListEqualityComparer<T>}},
> {{J2N.Collections.Generic.SetEqualityComparer<T>}},
> {{J2N.Collections.Generic.DictionaryEqualityComparer<TKey, TValue>}}, and
> {{J2N.Collections.StructuralEqualityComparer<T>}} that implement the
> structural equality behavior for each type of collection. These types should
> be passed in through each collection's constructor, as each has a {{Default}}
> and an {{Aggressive}} implementation.
> {{Default}} is more efficient and should be used in all closed scenarios
> within Lucene.NET (where the collection is not passed in from outside of the
> class). {{Aggressive}} is designed to interoperate with built-in .NET
> collections.
> See [these minimal examples of
> implementations|https://github.com/NightOwl888/J2N/tree/a50d41668cf459f3fe827dff5f1746422155c4f6/src/J2N.TestFramework/Util].
> h3. *Collection Formatting*
> J2N has a {{StringFormatter}} class that can be used to format collections,
> as follows.
> {code:c#}
> // IFormattable
> public string ToString(IFormatProvider provider)
> {
> return string.Format(provider, "{0}", this);
> }
> public override string ToString()
> {
> return ToString(StringFormatter.CurrentCulture);
> }
> {code}
> h3. *Nullable Keys*
> Use the attached {{NullableKey<T>}} and {{NullableKeyDictionary<TKey,
> TValue>}} implementations. {{NullableKeyDictionary<TKey, TValue>}} is
> intended to be a base class for all nullable key dictionary implementations.
> The backing dictionary (the one we are trying to mimic) is then passed in
> through its constructor.
> h3. *Integration*
> After the collections have been implemented, we can eliminate the usage of
> {{Lucene.Net.Support.Collections.Equals()}},
> {{Lucene.Net.Support.Collections.GetHashCode(), and
> {{Lucene.Net.Support.Collections.ToString()}}.
> Usage in of {{Lucene.Net.Support.Collections.Equals()}} and
> {{Lucene.Net.Support.Collections.GetHashCode() in Lucene.Net can be changed
> to the equality comparer matching the collection type.
> For string formatting, the usage can simply be changed to
> {{collection.ToString()}} in production code, and we can use in
> {{collection.ToString(J2N.Text.StringFormatter.InvariantCulture)}} to patch
> tests.
> For types where collections are passed from the outside that may contain
> nested collections, we should either use {{Aggressive}} structural
> comparison, or document that if nested collections are needed, the end user
> should use collections that implement {{IStructuralEquatable}}, such as those
> from J2N.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)