Skip to content

Commit dd5fad3

Browse files
author
rstam
committed
Implemented IEquatable<MongoDBRef>, !=, ==, Equals and GetHashCode for MongoDBRef.
1 parent d02c35e commit dd5fad3

File tree

2 files changed

+106
-1
lines changed

2 files changed

+106
-1
lines changed

Driver/Core/MongoDBRef.cs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace MongoDB.Driver
3030
/// <summary>
3131
/// Represents a DBRef (a convenient way to refer to a document).
3232
/// </summary>
33-
public class MongoDBRef
33+
public class MongoDBRef : IEquatable<MongoDBRef>
3434
{
3535
// private fields
3636
private string _databaseName;
@@ -91,6 +91,69 @@ public BsonValue Id
9191
{
9292
get { return _id; }
9393
}
94+
95+
// public operators
96+
/// <summary>
97+
/// Compares two MongoDBRefs.
98+
/// </summary>
99+
/// <param name="lhs">The first MongoDBRef.</param>
100+
/// <param name="rhs">The other MongoDBRef.</param>
101+
/// <returns>True if the two MongoDBRefs are not equal (or one is null and the other is not).</returns>
102+
public static bool operator !=(MongoDBRef lhs, MongoDBRef rhs)
103+
{
104+
return !(lhs == rhs);
105+
}
106+
107+
/// <summary>
108+
/// Compares two MongoDBRefs.
109+
/// </summary>
110+
/// <param name="lhs">The first MongoDBRef.</param>
111+
/// <param name="rhs">The other MongoDBRef.</param>
112+
/// <returns>True if the two MongoDBRefs are equal (or both null).</returns>
113+
public static bool operator ==(MongoDBRef lhs, MongoDBRef rhs)
114+
{
115+
return object.Equals(lhs, rhs);
116+
}
117+
118+
// public methods
119+
/// <summary>
120+
/// Compares this MongoDBRef to another one.
121+
/// </summary>
122+
/// <param name="rhs">The other MongoDBRef.</param>
123+
/// <returns>True if the two MongoDBRefs are equal.</returns>
124+
public bool Equals(MongoDBRef rhs)
125+
{
126+
if (object.ReferenceEquals(rhs, null) || GetType() != rhs.GetType())
127+
{
128+
return false;
129+
}
130+
// note: _databaseName can be null
131+
return object.Equals(_databaseName, rhs._databaseName) && _collectionName.Equals(rhs._collectionName) && _id.Equals(rhs._id);
132+
}
133+
134+
/// <summary>
135+
/// Compares this MongoDBRef to another object.
136+
/// </summary>
137+
/// <param name="obj">The other object.</param>
138+
/// <returns>True if the other objects is a MongoDBRef and is equal to this one.</returns>
139+
public override bool Equals(object obj)
140+
{
141+
return Equals(obj as MongoDBRef); // works even if obj is null or of a different type
142+
}
143+
144+
/// <summary>
145+
/// Gets the hash code.
146+
/// </summary>
147+
/// <returns>The hash code.</returns>
148+
public override int GetHashCode()
149+
{
150+
// see Effective Java by Joshua Bloch
151+
int hash = 17;
152+
hash = 37 * hash + ((_databaseName == null) ? 0 :_databaseName.GetHashCode());
153+
hash = 37 * hash + _collectionName.GetHashCode();
154+
hash = 37 * hash + _id.GetHashCode();
155+
return hash;
156+
}
94157
}
95158

96159
/// <summary>

DriverUnitTests/Core/MongoDBRefTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,48 @@ public void TestDocumentRefId()
8686
Assert.IsTrue(bson.SequenceEqual(rehydrated.ToBson()));
8787
}
8888

89+
[Test]
90+
public void TestEqualsWithDatabase()
91+
{
92+
var dbRef1a = new MongoDBRef("database", "collection", 1);
93+
var dbRef1b = new MongoDBRef("database", "collection", 1);
94+
var dbRef2 = new MongoDBRef("database", "collection", 2);
95+
MongoDBRef nullDbRef = null;
96+
97+
Assert.IsFalse(object.ReferenceEquals(dbRef1a, dbRef1b));
98+
Assert.IsTrue(dbRef1a == dbRef1b);
99+
Assert.IsFalse(dbRef1a == dbRef2);
100+
Assert.IsFalse(dbRef1a == null);
101+
Assert.IsFalse(null == dbRef1b);
102+
Assert.IsFalse(dbRef1a == nullDbRef);
103+
Assert.IsFalse(nullDbRef == dbRef1b);
104+
Assert.IsTrue(nullDbRef == null);
105+
Assert.IsTrue(null == nullDbRef);
106+
107+
Assert.AreEqual(dbRef1a.GetHashCode(), dbRef1b.GetHashCode());
108+
}
109+
110+
[Test]
111+
public void TestEqualsWithoutDatabase()
112+
{
113+
var dbRef1a = new MongoDBRef("collection", 1);
114+
var dbRef1b = new MongoDBRef("collection", 1);
115+
var dbRef2 = new MongoDBRef("collection", 2);
116+
MongoDBRef nullDbRef = null;
117+
118+
Assert.IsFalse(object.ReferenceEquals(dbRef1a, dbRef1b));
119+
Assert.IsTrue(dbRef1a == dbRef1b);
120+
Assert.IsFalse(dbRef1a == dbRef2);
121+
Assert.IsFalse(dbRef1a == null);
122+
Assert.IsFalse(null == dbRef1b);
123+
Assert.IsFalse(dbRef1a == nullDbRef);
124+
Assert.IsFalse(nullDbRef == dbRef1b);
125+
Assert.IsTrue(nullDbRef == null);
126+
Assert.IsTrue(null == nullDbRef);
127+
128+
Assert.AreEqual(dbRef1a.GetHashCode(), dbRef1b.GetHashCode());
129+
}
130+
89131
[Test]
90132
public void TestGuidRefId()
91133
{

0 commit comments

Comments
 (0)