Example #1
0
        /// <summary>
        /// Compare two entries based on the rules specified by
        /// <b>IComparer</b>.
        /// </summary>
        /// <remarks>
        /// <p>
        /// If possible, use the <see cref="IQueryCacheEntry.Extract"/>
        /// method to optimize the value extraction process.</p>
        /// <p>
        /// This method is expected to be implemented by <b>IComparer</b>
        /// wrappers, which simply pass on this invocation to the wrapped
        /// <b>IComparer</b> objects if they too implement this interface, or
        /// to invoke their default compare method passing the actual objects
        /// (not the extracted values) obtained from the extractor using the
        /// passed entries.</p>
        /// <p>
        /// This interface is also expected to be implemented by
        /// <see cref="IValueExtractor"/> implementations that implement the
        /// <b>IComparer</b> interface. It is expected that in most cases,
        /// the <b>IComparer</b> wrappers will eventually terminate at (i.e.
        /// delegate to) <b>IValueExtractors</b> that also implement this
        /// interface.</p>
        /// </remarks>
        /// <param name="entry1">
        /// The first entry to compare values from; read-only.
        /// </param>
        /// <param name="entry2">
        /// The second entry to compare values from; read-only.
        /// </param>
        /// <returns>
        /// A negative integer, zero, or a positive integer as the first
        /// entry denotes a value that is is less than, equal to, or greater
        /// than the value denoted by the second entry.
        /// </returns>
        /// <exception cref="InvalidCastException">
        /// If the arguments' types prevent them from being compared by this
        /// <b>IComparer</b>.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// If the extractor cannot handle the passed objects for any other
        /// reason; an implementor should include a descriptive message.
        /// </exception>
        /// <since>Coherence 3.2</since>
        public override int CompareEntries(IQueryCacheEntry entry1, IQueryCacheEntry entry2)
        {
            IValueExtractor[] extractors = Extractors;

            for (int i = 0, c = extractors.Length; i < c; i++)
            {
                IValueExtractor extractor = extractors[i];

                int result = SafeComparer.CompareSafe(null, entry1.Extract(extractor), entry2.Extract(extractor));
                if (result != 0)
                {
                    return(result);
                }
            }
            return(0);
        }
 /// <summary>
 /// Compare two entries.
 /// </summary>
 /// <param name="entry1">
 /// The first entry to compare values from; read-only.
 /// </param>
 /// <param name="entry2">
 /// The second entry to compare values from; read-only.
 /// </param>
 /// <returns>
 /// A negative integer, zero, or a positive integer as the first
 /// entry denotes a value that is is less than, equal to, or greater
 /// than the value denoted by the second entry
 /// </returns>
 /// <exception cref="InvalidCastException">
 /// If the arguments' types prevent them from being compared by this
 /// <b>IComparer</b>.
 /// </exception>
 /// <exception cref="ArgumentException">
 /// If the extractor cannot handle the passed objects for any other
 /// reason; an implementor should include a descriptive message.
 /// </exception>
 public virtual int CompareEntries(IQueryCacheEntry entry1, IQueryCacheEntry entry2)
 {
     return(SafeComparer.CompareSafe(null, entry1.Extract(this), entry2.Extract(this)));
 }