Skip to content

Commit d0ed9cd

Browse files
committed
Merge pull request #15 from gaillard/master
Add prefix check to index generation.
2 parents 526d6b5 + 407e5cb commit d0ed9cd

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

DominionEnterprises.Mongo.Tests/QueueTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ public void EnsureCountIndex()
138138
Assert.AreEqual(expectedTwo, collection.GetIndexes()[2].Key);
139139
}
140140

141+
[Test]
142+
public void EnsureCountIndexWithPrefixOfPrevious()
143+
{
144+
queue.EnsureCountIndex(new IndexKeysDocument { { "type", 1 }, { "boo", -1 } }, false);
145+
queue.EnsureCountIndex(new IndexKeysDocument { { "type", 1 } }, false);
146+
147+
Assert.AreEqual(2, collection.GetIndexes().Count);
148+
149+
var expectedOne = new IndexKeysDocument { { "payload.type", 1 }, { "payload.boo", -1 } };
150+
Assert.AreEqual(expectedOne, collection.GetIndexes()[1].Key);
151+
}
152+
141153
[Test]
142154
[ExpectedException(typeof(ArgumentException))]
143155
public void EnsureCountIndexWithBadValue()

DominionEnterprises.Mongo/Queue.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System;
22
using System.Configuration;
33
using System.Threading;
4+
using System.Linq;
45
using MongoDB.Bson;
56
using MongoDB.Driver;
67
using System.Reflection;
78
using System.Security.Cryptography;
89

9-
[assembly: AssemblyVersion("1.2.0.*")]
10+
[assembly: AssemblyVersion("1.2.1.*")]
1011

1112
namespace DominionEnterprises.Mongo
1213
{
@@ -103,6 +104,7 @@ public void EnsureGetIndex(IndexKeysDocument beforeSort, IndexKeysDocument after
103104

104105
/// <summary>
105106
/// Ensure index for Count() method
107+
/// Is a no-op if the generated index is a prefix of an existing one. If you have a similar EnsureGetIndex call, call it first.
106108
/// </summary>
107109
/// <param name="index">fields in Count() call</param>
108110
/// <param name="includeRunning">whether running was given to Count() or not</param>
@@ -491,6 +493,18 @@ public void Send(BsonDocument payload, DateTime earliestGet, double priority)
491493

492494
private void EnsureIndex(IndexKeysDocument index)
493495
{
496+
//if index is a prefix of any existing index we are good
497+
foreach (var existingIndex in collection.GetIndexes())
498+
{
499+
var names = index.Names;
500+
var values = index.Values;
501+
var existingNamesPrefix = existingIndex.Key.Names.Take(names.Count());
502+
var existingValuesPrefix = existingIndex.Key.Values.Take(values.Count());
503+
504+
if (Enumerable.SequenceEqual(names, existingNamesPrefix) && Enumerable.SequenceEqual(values, existingValuesPrefix))
505+
return;
506+
}
507+
494508
for (var i = 0; i < 5; ++i)
495509
{
496510
for (var name = Guid.NewGuid().ToString(); name.Length > 0; name = name.Substring(0, name.Length - 1))

0 commit comments

Comments
 (0)