Skip to content

Commit 09551fe

Browse files
committed
CSHARP-1409: added bit operators to the query builders.
1 parent 57f8b42 commit 09551fe

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

MongoDB.Driver/Builders/QueryBuilder.cs

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,50 @@ public static IMongoQuery And(params IMongoQuery[] queries)
102102
return And((IEnumerable<IMongoQuery>)queries);
103103
}
104104

105+
/// <summary>
106+
/// Tests that the value of the named element has all of the specified bits clear.
107+
/// </summary>
108+
/// <param name="name">The name.</param>
109+
/// <param name="bitmask">The bitmask.</param>
110+
/// <returns>An IMongoQuery.</returns>
111+
public static IMongoQuery BitsAllClear(string name, long bitmask)
112+
{
113+
return new QueryDocument(name, new BsonDocument("$bitsAllClear", bitmask));
114+
}
115+
116+
/// <summary>
117+
/// Tests that the value of the named element has all of the specified bits set.
118+
/// </summary>
119+
/// <param name="name">The name.</param>
120+
/// <param name="bitmask">The bitmask.</param>
121+
/// <returns>An IMongoQuery.</returns>
122+
public static IMongoQuery BitsAllSet(string name, long bitmask)
123+
{
124+
return new QueryDocument(name, new BsonDocument("$bitsAllSet", bitmask));
125+
}
126+
127+
/// <summary>
128+
/// Tests that the value of the named element has any of the specified bits clear.
129+
/// </summary>
130+
/// <param name="name">The name.</param>
131+
/// <param name="bitmask">The bitmask.</param>
132+
/// <returns>An IMongoQuery.</returns>
133+
public static IMongoQuery BitsAnyClear(string name, long bitmask)
134+
{
135+
return new QueryDocument(name, new BsonDocument("$bitsAnyClear", bitmask));
136+
}
137+
138+
/// <summary>
139+
/// Tests that the value of the named element has any of the specified bits set.
140+
/// </summary>
141+
/// <param name="name">The name.</param>
142+
/// <param name="bitmask">The bitmask.</param>
143+
/// <returns>An IMongoQuery.</returns>
144+
public static IMongoQuery BitsAnySet(string name, long bitmask)
145+
{
146+
return new QueryDocument(name, new BsonDocument("$bitsAnySet", bitmask));
147+
}
148+
105149
/// <summary>
106150
/// Tests that at least one item of the named array element matches a query (see $elemMatch).
107151
/// </summary>
@@ -1072,6 +1116,50 @@ public static IMongoQuery All<TValue>(Expression<Func<TDocument, IEnumerable<TVa
10721116
return new QueryBuilder<TDocument>().All(memberExpression, values);
10731117
}
10741118

1119+
/// <summary>
1120+
/// Tests that the value of the named element has all of the specified bits clear.
1121+
/// </summary>
1122+
/// <param name="memberExpression">The member expression.</param>
1123+
/// <param name="bitmask">The bitmask.</param>
1124+
/// <returns>An IMongoQuery.</returns>
1125+
public static IMongoQuery BitsAllClear(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1126+
{
1127+
return new QueryBuilder<TDocument>().BitsAllClear(memberExpression, bitmask);
1128+
}
1129+
1130+
/// <summary>
1131+
/// Tests that the value of the named element has all of the specified bits set.
1132+
/// </summary>
1133+
/// <param name="memberExpression">The member expression.</param>
1134+
/// <param name="bitmask">The bitmask.</param>
1135+
/// <returns>An IMongoQuery.</returns>
1136+
public static IMongoQuery BitsAllSet(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1137+
{
1138+
return new QueryBuilder<TDocument>().BitsAllSet(memberExpression, bitmask);
1139+
}
1140+
1141+
/// <summary>
1142+
/// Tests that the value of the named element has any of the specified bits clear.
1143+
/// </summary>
1144+
/// <param name="memberExpression">The member expression.</param>
1145+
/// <param name="bitmask">The bitmask.</param>
1146+
/// <returns>An IMongoQuery.</returns>
1147+
public static IMongoQuery BitsAnyClear(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1148+
{
1149+
return new QueryBuilder<TDocument>().BitsAnyClear(memberExpression, bitmask);
1150+
}
1151+
1152+
/// <summary>
1153+
/// Tests that the value of the named element has any of the specified bits set.
1154+
/// </summary>
1155+
/// <param name="memberExpression">The member expression.</param>
1156+
/// <param name="bitmask">The bitmask.</param>
1157+
/// <returns>An IMongoQuery.</returns>
1158+
public static IMongoQuery BitsAnySet(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1159+
{
1160+
return new QueryBuilder<TDocument>().BitsAnySet(memberExpression, bitmask);
1161+
}
1162+
10751163
/// <summary>
10761164
/// Tests that at least one item of the named array element matches a query (see $elemMatch).
10771165
/// </summary>
@@ -1660,6 +1748,74 @@ public IMongoQuery And(params IMongoQuery[] queries)
16601748
return And((IEnumerable<IMongoQuery>)queries);
16611749
}
16621750

1751+
/// <summary>
1752+
/// Tests that the value of the named element has all of the specified bits clear.
1753+
/// </summary>
1754+
/// <param name="memberExpression">The member expression.</param>
1755+
/// <param name="bitmask">The bitmask.</param>
1756+
/// <returns>An IMongoQuery.</returns>
1757+
public IMongoQuery BitsAllClear(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1758+
{
1759+
if (memberExpression == null)
1760+
{
1761+
throw new ArgumentNullException("memberExpression");
1762+
}
1763+
1764+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
1765+
return Query.BitsAllClear(serializationInfo.ElementName, bitmask);
1766+
}
1767+
1768+
/// <summary>
1769+
/// Tests that the value of the named element has all of the specified bits set.
1770+
/// </summary>
1771+
/// <param name="memberExpression">The member expression.</param>
1772+
/// <param name="bitmask">The bitmask.</param>
1773+
/// <returns>An IMongoQuery.</returns>
1774+
public IMongoQuery BitsAllSet(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1775+
{
1776+
if (memberExpression == null)
1777+
{
1778+
throw new ArgumentNullException("memberExpression");
1779+
}
1780+
1781+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
1782+
return Query.BitsAllSet(serializationInfo.ElementName, bitmask);
1783+
}
1784+
1785+
/// <summary>
1786+
/// Tests that the value of the named element has any of the specified bits clear.
1787+
/// </summary>
1788+
/// <param name="memberExpression">The member expression.</param>
1789+
/// <param name="bitmask">The bitmask.</param>
1790+
/// <returns>An IMongoQuery.</returns>
1791+
public IMongoQuery BitsAnyClear(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1792+
{
1793+
if (memberExpression == null)
1794+
{
1795+
throw new ArgumentNullException("memberExpression");
1796+
}
1797+
1798+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
1799+
return Query.BitsAnyClear(serializationInfo.ElementName, bitmask);
1800+
}
1801+
1802+
/// <summary>
1803+
/// Tests that the value of the named element has any of the specified bits set.
1804+
/// </summary>
1805+
/// <param name="memberExpression">The member expression.</param>
1806+
/// <param name="bitmask">The bitmask.</param>
1807+
/// <returns>An IMongoQuery.</returns>
1808+
public IMongoQuery BitsAnySet(Expression<Func<TDocument, object>> memberExpression, long bitmask)
1809+
{
1810+
if (memberExpression == null)
1811+
{
1812+
throw new ArgumentNullException("memberExpression");
1813+
}
1814+
1815+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
1816+
return Query.BitsAnySet(serializationInfo.ElementName, bitmask);
1817+
}
1818+
16631819
/// <summary>
16641820
/// Tests that at least one item of the named array element matches a query (see $elemMatch).
16651821
/// </summary>

MongoDB.DriverUnitTests/Builders/QueryBuilderTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,46 @@ public void TestAndXNE1YNE2()
196196
Assert.AreEqual(NegateArbitraryQuery(expected), Query.Not(query).ToJson());
197197
}
198198

199+
[Test]
200+
public void TestBitsAllClear()
201+
{
202+
var query = Query.BitsAllClear("x", 3);
203+
var expected = "{ \"x\" : { \"$bitsAllClear\" : NumberLong(3) } }";
204+
var negated = "{ \"x\" : { \"$not\" : { \"$bitsAllClear\" : NumberLong(3) } } }";
205+
Assert.AreEqual(expected, query.ToJson());
206+
Assert.AreEqual(negated, Query.Not(query).ToJson());
207+
}
208+
209+
[Test]
210+
public void TestBitsAllSet()
211+
{
212+
var query = Query.BitsAllSet("x", 3);
213+
var expected = "{ \"x\" : { \"$bitsAllSet\" : NumberLong(3) } }";
214+
var negated = "{ \"x\" : { \"$not\" : { \"$bitsAllSet\" : NumberLong(3) } } }";
215+
Assert.AreEqual(expected, query.ToJson());
216+
Assert.AreEqual(negated, Query.Not(query).ToJson());
217+
}
218+
219+
[Test]
220+
public void TestBitsAnyClear()
221+
{
222+
var query = Query.BitsAnyClear("x", 3);
223+
var expected = "{ \"x\" : { \"$bitsAnyClear\" : NumberLong(3) } }";
224+
var negated = "{ \"x\" : { \"$not\" : { \"$bitsAnyClear\" : NumberLong(3) } } }";
225+
Assert.AreEqual(expected, query.ToJson());
226+
Assert.AreEqual(negated, Query.Not(query).ToJson());
227+
}
228+
229+
[Test]
230+
public void TestBitsAnySet()
231+
{
232+
var query = Query.BitsAnySet("x", 3);
233+
var expected = "{ \"x\" : { \"$bitsAnySet\" : NumberLong(3) } }";
234+
var negated = "{ \"x\" : { \"$not\" : { \"$bitsAnySet\" : NumberLong(3) } } }";
235+
Assert.AreEqual(expected, query.ToJson());
236+
Assert.AreEqual(negated, Query.Not(query).ToJson());
237+
}
238+
199239
[Test]
200240
public void TestElementMatch()
201241
{

MongoDB.DriverUnitTests/Builders/QueryBuilderTypedTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,38 @@ public void TestAnd_NotExpression()
112112
Assert.AreEqual(expected, query.ToJson());
113113
}
114114

115+
[Test]
116+
public void TestBitsAllClear()
117+
{
118+
var query = Query<A>.BitsAllClear(x => x.X, 3);
119+
var expected = "{ \"x\" : { \"$bitsAllClear\" : NumberLong(3) } }";
120+
Assert.AreEqual(expected, query.ToJson());
121+
}
122+
123+
[Test]
124+
public void TestBitsAllSet()
125+
{
126+
var query = Query<A>.BitsAllSet(x => x.X, 3);
127+
var expected = "{ \"x\" : { \"$bitsAllSet\" : NumberLong(3) } }";
128+
Assert.AreEqual(expected, query.ToJson());
129+
}
130+
131+
[Test]
132+
public void TestBitsAnyClear()
133+
{
134+
var query = Query<A>.BitsAnyClear(x => x.X, 3);
135+
var expected = "{ \"x\" : { \"$bitsAnyClear\" : NumberLong(3) } }";
136+
Assert.AreEqual(expected, query.ToJson());
137+
}
138+
139+
[Test]
140+
public void TestBitsAnySet()
141+
{
142+
var query = Query<A>.BitsAnySet(x => x.X, 3);
143+
var expected = "{ \"x\" : { \"$bitsAnySet\" : NumberLong(3) } }";
144+
Assert.AreEqual(expected, query.ToJson());
145+
}
146+
115147
[Test]
116148
public void TestBooleanExpressionTrueForMethods()
117149
{

0 commit comments

Comments
 (0)