Skip to content

Commit

Permalink
CSHARP-580: command based helper methods in MongoCollection should us…
Browse files Browse the repository at this point in the history
…e the collection's ReadPreference.
  • Loading branch information
rstam committed Oct 1, 2012
1 parent 34bbb5b commit a6eafbd
Showing 1 changed file with 31 additions and 15 deletions.
46 changes: 31 additions & 15 deletions Driver/Core/MongoCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public abstract class MongoCollection
// private fields
private MongoServer _server;
private MongoDatabase _database;
private MongoDatabase _commandDatabase; // used to run commands with this collection's settings
private MongoCollectionSettings _settings;
private string _name;

Expand Down Expand Up @@ -67,6 +68,21 @@ protected MongoCollection(MongoDatabase database, MongoCollectionSettings settin
_database = database;
_settings = settings.FrozenCopy();
_name = settings.CollectionName;

// note: if the settings are compatible _commandDatabase will end up being the same instance as _database
// need to check for $cmd to avoid infinite recursion
if (_name != "$cmd")
{
var commandDatabaseSettings = _database.Settings.Clone();
commandDatabaseSettings.GuidRepresentation = _settings.GuidRepresentation;
commandDatabaseSettings.ReadPreference = _settings.ReadPreference;
commandDatabaseSettings.SafeMode = _settings.SafeMode; // not really relevant to commands since they are all queries anyway
_commandDatabase = _server.GetDatabase(commandDatabaseSettings);
}
else
{
_commandDatabase = _database;
}
}

// public properties
Expand Down Expand Up @@ -121,7 +137,7 @@ public virtual AggregateResult Aggregate(IEnumerable<BsonDocument> operations)
{ "aggregate", _name },
{ "pipeline", pipeline }
};
return _database.RunCommandAs<AggregateResult>(aggregateCommand);
return _commandDatabase.RunCommandAs<AggregateResult>(aggregateCommand);
}

/// <summary>
Expand Down Expand Up @@ -155,7 +171,7 @@ public virtual long Count(IMongoQuery query)
{ "count", _name },
{ "query", BsonDocumentWrapper.Create(query), query != null } // query is optional
};
var result = _database.RunCommand(command);
var result = _commandDatabase.RunCommand(command);
return result.Response["n"].ToInt64();
}

Expand Down Expand Up @@ -231,7 +247,7 @@ public virtual IEnumerable<BsonValue> Distinct(string key, IMongoQuery query)
{ "key", key },
{ "query", BsonDocumentWrapper.Create(query), query != null } // query is optional
};
var result = _database.RunCommand(command);
var result = _commandDatabase.RunCommand(command);
return result.Response["values"].AsBsonArray;
}

Expand Down Expand Up @@ -298,7 +314,7 @@ public virtual CommandResult DropIndexByName(string indexName)
};
try
{
return _database.RunCommand(command);
return _commandDatabase.RunCommand(command);
}
catch (MongoCommandException ex)
{
Expand Down Expand Up @@ -457,7 +473,7 @@ public virtual FindAndModifyResult FindAndModify(
};
try
{
return _database.RunCommandAs<FindAndModifyResult>(command);
return _commandDatabase.RunCommandAs<FindAndModifyResult>(command);
}
catch (MongoCommandException ex)
{
Expand Down Expand Up @@ -494,7 +510,7 @@ public virtual FindAndModifyResult FindAndRemove(IMongoQuery query, IMongoSortBy
};
try
{
return _database.RunCommandAs<FindAndModifyResult>(command);
return _commandDatabase.RunCommandAs<FindAndModifyResult>(command);
}
catch (MongoCommandException ex)
{
Expand Down Expand Up @@ -638,7 +654,7 @@ public virtual GeoHaystackSearchResult GeoHaystackSearchAs(
command.Merge(options.ToBsonDocument());
var geoHaystackSearchResultDefinition = typeof(GeoHaystackSearchResult<>);
var geoHaystackSearchResultType = geoHaystackSearchResultDefinition.MakeGenericType(documentType);
return (GeoHaystackSearchResult)_database.RunCommandAs(geoHaystackSearchResultType, command);
return (GeoHaystackSearchResult)_commandDatabase.RunCommandAs(geoHaystackSearchResultType, command);
}

/// <summary>
Expand Down Expand Up @@ -684,7 +700,7 @@ public virtual GeoNearResult<TDocument> GeoNearAs<TDocument>(
{ "query", BsonDocumentWrapper.Create(query), query != null } // query is optional
};
command.Merge(options.ToBsonDocument());
return _database.RunCommandAs<GeoNearResult<TDocument>>(command);
return _commandDatabase.RunCommandAs<GeoNearResult<TDocument>>(command);
}

/// <summary>
Expand Down Expand Up @@ -729,7 +745,7 @@ public virtual GeoNearResult GeoNearAs(
command.Merge(options.ToBsonDocument());
var geoNearResultDefinition = typeof(GeoNearResult<>);
var geoNearResultType = geoNearResultDefinition.MakeGenericType(documentType);
return (GeoNearResult)_database.RunCommandAs(geoNearResultType, command);
return (GeoNearResult)_commandDatabase.RunCommandAs(geoNearResultType, command);
}

/// <summary>
Expand All @@ -750,7 +766,7 @@ public virtual GetIndexesResult GetIndexes()
public virtual CollectionStatsResult GetStats()
{
var command = new CommandDocument("collstats", _name);
return _database.RunCommandAs<CollectionStatsResult>(command);
return _commandDatabase.RunCommandAs<CollectionStatsResult>(command);
}

/// <summary>
Expand Down Expand Up @@ -828,7 +844,7 @@ public virtual IEnumerable<BsonDocument> Group(
}
}
};
var result = _database.RunCommand(command);
var result = _commandDatabase.RunCommand(command);
return result.Response["retval"].AsBsonArray.Values.Cast<BsonDocument>();
}

Expand Down Expand Up @@ -875,7 +891,7 @@ public virtual IEnumerable<BsonDocument> Group(
}
}
};
var result = _database.RunCommand(command);
var result = _commandDatabase.RunCommand(command);
return result.Response["retval"].AsBsonArray.Values.Cast<BsonDocument>();
}

Expand Down Expand Up @@ -1203,7 +1219,7 @@ public virtual MapReduceResult MapReduce(
{ "reduce", reduce }
};
command.Add(options.ToBsonDocument());
var result = _database.RunCommandAs<MapReduceResult>(command);
var result = _commandDatabase.RunCommandAs<MapReduceResult>(command);
result.SetInputDatabase(_database);
return result;
}
Expand Down Expand Up @@ -1259,7 +1275,7 @@ public virtual MapReduceResult MapReduce(BsonJavaScript map, BsonJavaScript redu
public virtual CommandResult ReIndex()
{
var command = new CommandDocument("reIndex", _name);
return _database.RunCommand(command);
return _commandDatabase.RunCommand(command);
}

/// <summary>
Expand Down Expand Up @@ -1604,7 +1620,7 @@ public virtual SafeModeResult Update(
public virtual ValidateCollectionResult Validate()
{
var command = new CommandDocument("validate", _name);
return _database.RunCommandAs<ValidateCollectionResult>(command);
return _commandDatabase.RunCommandAs<ValidateCollectionResult>(command);
}

// internal methods
Expand Down

0 comments on commit a6eafbd

Please sign in to comment.