Excellent news. I was thinking of
something along the same general lines, as it would not only bring the equality
semantics into line it could also bring a single solution to bear on both
application-provided maps and maps generated from a parameter-mapped application-provided
objects. I’ll be eagerly awaiting the commit. J
Jeremy Gray
From: Clinton Begin
[mailto:[EMAIL PROTECTED]
Sent: Wednesday, November 30, 2005
4:31 PM
To: dev@ibatis.apache.org
Subject: Re: [jira] Commented:
(IBATISNET-118) CacheKey.Equals(object) override can return true when the
parameters have the same HashCode but are not equal.
The iBATIS for Java version compares the parameters using the same values that
are sent to the database, which means all values compared are primitive (with
equals and hashcode consistently implemented by the core class library).
Something similar could be done in the .NET version. Like I said, this is
kind of a "been there, done that" for me, as we had the same issue in
the Java version.
Thomas Tannahill has already written a test that fails and an implementation
that fixes it. I'll ask him for it.
Cheers,
Clinton
On 11/30/05, Jeremy
Gray (JIRA) <ibatis-dev@incubator.apache.org>
wrote:
[
http://issues.apache.org/jira/browse/IBATISNET-118?page=comments#action_12358975
]
Jeremy Gray commented on IBATISNET-118:
---------------------------------------
Gilles: Having reviewed the CacheKey code _again_ this fall (after first
looking at it back in the spring) I can tell you that it does not do what you
describe. Types that need to be treated as special cases (e.g. Hashtable) given
the needs of the application are currently using only hashcode and perhaps
Equals comparisons. Other types are treated as a special case (walking their
properties) when the .NET equality semantics demand that they strictly be
compared based on GetHashCode and Equals. Even given the current logic,
GetHashCode and Equals are not internally consistent - one of them applies
different special cases than the other.
Clinton: Our
company would love it to be fixed for us :), but will be happy to implement the
fix at the point in our schedule where it becomes critical. That said, at the
time we can implement it I doubt we'll be able to verify against the full set
of ibatis.net test cases, so we might need a
hand in verification from someone who is already set up to do so.
> CacheKey.Equals(object) override can return true when the parameters have
the same HashCode but are not equal.
>
--------------------------------------------------------------------------------------------------------------
>
> Key:
IBATISNET-118
> URL: http://issues.apache.org/jira/browse/IBATISNET-118
> Project: iBatis for .NET
> Type: Bug
> Components: DataMapper
> Versions: DataMapper 1.2.1
> Environment: Windows
> Reporter: Thomas Tannahill
> Assignee: Gilles Bayon
> Fix For: DataMapper 1.3
>
> CacheKey.Equals(object) override can return true when the parameters have
the same HashCode but are not equal. This can cause false cache
hits.
> Only an issue for complex parameters.
> Failing NUnit test:
> ---- UNIT TEST BEGIN ----
> using IBatisNet.DataMapper;
> using IBatisNet.DataMapper.TypeHandlers;
> using NUnit.Framework;
> namespace IBatisNet.DataAccess
> {
> [TestFixture]
> public class CacheKeyTests
> {
>
private const long A_LONG = 1L;
>
private const long ANOTHER_LONG_WITH_SAME_HASHCODE = -9223372034707292159;
>
>
public CacheKeyTests()
>
{
>
}
>
[Test]
>
public void ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotEqual()
>
{
>
TypeHandlerFactory factory = new TypeHandlerFactory();
>
// Two cache keys are equal except for the parameter.
>
CacheKey key = new CacheKey(factory, "STATEMENT", "SQL",
new TestClass(A_LONG), new string[] {"AProperty"}, 0, 0,
CacheKeyType.Object);
>
CacheKey aDifferentKey = new CacheKey(factory, "STATEMENT",
"SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new string[]
{"AProperty"}, 0, 0, CacheKeyType.Object);
>
Assert.IsFalse(aDifferentKey.Equals(key)); // should not be equal.
>
}
> }
> public class TestClass
> {
>
private long aProperty;
>
public TestClass(long aProperty)
>
{
>
this.aProperty = aProperty;
>
}
>
public long AProperty
>
{
>
get { return aProperty; }
>
set { aProperty = value; }
>
}
> }
> }
> ---- UNIT TEST END ----
> The test passes if you replace this line in CacheKey.Equals():
> if
(_hashCode != cacheKey._hashCode) return false;
> with something like this:
> if
(this._parameter == null && cacheKey._parameter != null) return false;
> if
(this._parameter != null && cacheKey._parameter == null) return false;
> if
(!this._parameter.Equals(cacheKey._parameter)) return false;
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira