/// <summary> /// Converts a JObject to a series of assignment objects, set to this document. /// </summary> /// <param name="data">The data to convert</param> /// <returns>this</returns> public IDatabaseObject FromJObject(JObject data) { foreach (var property in data) { var value = property.Value as JValue; var obj = property.Value as JObject; var array = property.Value as JArray; if (value != null) { this.Set(property.Key, value.Value); } else if (obj != null) { DocumentValue document = new DocumentValue(); document.FromJObject(obj); this.Set(property.Key, document.ToObject()); } else if (array != null) { CollectionValue collection = new CollectionValue(); collection.FromJObject(array); this.Set(property.Key, collection.ToObject()); } } return this; }
public void TestComplexFromQuerySingle() { var item = new CollectionValue() { new DocumentValue().Set("IntegerValue", 1).Set("LongValue", 2).Set("DoubleValue", 3.5).Set("StringValue", "Phogue").Set("DateTimeValue", new DateTime(2013, 12, 19, 13, 38, 0)).Set("SingleMockSimpleModel", new Dictionary<String, Object>() { {"Id", 10}, {"Name", "Zaeed"} }).Set("MultipleMockSimpleModel", new List<Object>() { new Dictionary<String, Object>() { {"Id", 20}, {"Name", "Ike"} }, new Dictionary<String, Object>() { {"Id", 30}, {"Name", "Phil"} } }) }; var models = MockComplexModel.FromQuery(item); Assert.AreEqual(1, models.First().IntegerValue); Assert.AreEqual(2, models.First().LongValue); Assert.AreEqual(3.5D, models.First().DoubleValue); Assert.AreEqual("Phogue", models.First().StringValue); Assert.AreEqual(new DateTime(2013, 12, 19, 13, 38, 0), models.First().DateTimeValue); Assert.AreEqual(10, models.First().SingleMockSimpleModel.Id); Assert.AreEqual("Zaeed", models.First().SingleMockSimpleModel.Name); Assert.AreEqual(20, models.First().MultipleMockSimpleModel.First().Id); Assert.AreEqual("Ike", models.First().MultipleMockSimpleModel.First().Name); Assert.AreEqual(30, models.First().MultipleMockSimpleModel.Last().Id); Assert.AreEqual("Phil", models.First().MultipleMockSimpleModel.Last().Name); }
protected override List<IDatabaseObject> Query(ICompiledQuery query) { CollectionValue result = new CollectionValue(); List<IDatabaseObject> results = new List<IDatabaseObject>(); try { results.Add(query.Root is Find ? this.Read(query, result) : this.Execute(query, result)); } catch (Exception exception) { results.Add(new Error() { new StringValue() { Data = exception.Message } }); } // Execute any index calls. foreach (ICompiledQuery child in query.Children.Where(child => !(child.Root is Merge))) { results.AddRange(this.Query(child)); } return results; }
/// <summary> /// Query anything that does not return any results /// </summary> /// <param name="query"></param> /// <param name="result"></param> /// <returns></returns> protected CollectionValue Execute(ICompiledQuery query, CollectionValue result) { if (this.Connection != null && this.Connection.State == ConnectionState.Open) { using (IDbCommand command = this.Connection.CreateCommand()) { command.CommandText = query.Compiled.FirstOrDefault(); result.Add(new Affected() { new NumericValue() { Long = command.ExecuteNonQuery() } }); } } return result; }
/// <summary> /// Query a SELECT statement which returns results /// </summary> /// <param name="query"></param> /// <param name="result"></param> /// <returns></returns> protected CollectionValue Read(ICompiledQuery query, CollectionValue result) { if (this.Connection != null && this.Connection.State == ConnectionState.Open) { using (IDbCommand command = this.Connection.CreateCommand()) { command.CommandText = query.Compiled.FirstOrDefault(); using (IDataReader reader = command.ExecuteReader()) { if (reader != null) { while (reader.Read() == true) { DocumentValue row = new DocumentValue(); for (int field = 0; field < reader.FieldCount; field++) { row.Set(reader.GetName(field), reader.GetValue(field)); } result.Add(row); } } } } } return result; }
protected override List<IDatabaseObject> Query(ICompiledQuery query) { List<IDatabaseObject> results = new List<IDatabaseObject>(); CollectionValue result = new CollectionValue(); try { if (query.Root is Find) { this.QueryFind(query, result); } else if (query.Root is Modify) { this.QueryModify(query, result); } else if (query.Root is Remove) { this.QueryRemove(query, result); } else if (query.Root is Drop) { this.QueryDrop(query, result); } // Essentially ignore the create command and process the index children instead. //else if (query.Root is Create) { // this.QueryCreate(query, results); //} else if (query.Root is Merge) { this.QueryMerge(query, result); } results.Add(result); } catch (Exception exception) { results.Add(new Error() { new StringValue() { Data = exception.Message } }); } foreach (ICompiledQuery child in query.Children) { results.AddRange(this.Query(child)); } return results; }
/// <summary> /// find and update, with upsert. /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryMerge(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); ICompiledQuery save = query.Children.FirstOrDefault(child => child.Root is Save); ICompiledQuery modify = query.Children.FirstOrDefault(child => child.Root is Modify); if (save != null && modify != null) { BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(modify.Conditions.FirstOrDefault()); BsonArray assignments = BsonSerializer.Deserialize<BsonArray>(save.Assignments.FirstOrDefault()); BsonArray sortings = BsonSerializer.Deserialize<BsonArray>(modify.Sortings.FirstOrDefault()); QueryDocument queryDocument = new QueryDocument(conditions.First().AsBsonDocument); IMongoSortBy sortByDocument = new SortByDocument(sortings.First().AsBsonDocument); UpdateDocument updateDocument = new UpdateDocument(assignments.First().AsBsonDocument); FindAndModifyResult findAndModifyResult = collection.FindAndModify(queryDocument, sortByDocument, updateDocument, true, true); result.Add(this.ToDocument(findAndModifyResult.ModifiedDocument)); } }
/// <summary> /// Drops a database or collection /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryDrop(ICompiledQuery query, CollectionValue result) { if (query.Databases.Any() == true && this.Database.Name == query.Databases.FirstOrDefault()) { this.Database.Drop(); result.Add( new Affected() { new NumericValue() { Long = 1 } } ); } else { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); CommandResult commandResult = collection.Drop(); result.Add( new Affected() { new NumericValue() { Long = commandResult.Ok == true ? 1 : 0 } } ); } }
/// <summary> /// Query to remove documents from a collection. /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryRemove(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(query.Conditions.FirstOrDefault()); WriteConcernResult writeConcernResult = collection.Remove(new QueryDocument(conditions.First().AsBsonDocument)); result.Add( new Affected() { new NumericValue() { Long = (int)writeConcernResult.DocumentsAffected } } ); }
/// <summary> /// Modify all documents that match a query /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryModify(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(query.Conditions.FirstOrDefault()); BsonArray assignments = BsonSerializer.Deserialize<BsonArray>(query.Assignments.FirstOrDefault()); QueryDocument queryDocument = new QueryDocument(conditions.First().AsBsonDocument); UpdateDocument updateDocument = new UpdateDocument(assignments.First().AsBsonDocument); WriteConcernResult writeConcernResult = collection.Update(queryDocument, updateDocument, UpdateFlags.Multi); result.Add( new Affected() { new NumericValue() { Long = (int)writeConcernResult.DocumentsAffected } } ); }
/// <summary> /// Select query on the database /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryFind(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(query.Conditions.FirstOrDefault()); MongoCursor<BsonDocument> cursor = collection.Find(new QueryDocument(conditions.First().AsBsonDocument)); if (query.Limit != null) { cursor.SetLimit((int)query.Limit.Value); } if (query.Skip != null) { cursor.SetSkip((int)query.Skip.Value); } result.AddRange(cursor.Select(this.ToDocument)); }
protected void QueryCreateIndex(ICompiledQuery query, CollectionValue result) { if (query.Collections.Any() == true) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray indices = BsonSerializer.Deserialize<BsonArray>(query.Indices.FirstOrDefault()); if (indices.Count > 1) { collection.EnsureIndex(new IndexKeysDocument(indices.First().AsBsonDocument), new IndexOptionsDocument(indices.Last().AsBsonDocument)); } else { collection.EnsureIndex(new IndexKeysDocument(indices.First().AsBsonDocument)); } } }
public void TestSimpleFromQuerySingle() { var item = new CollectionValue() { new DocumentValue().Set("Id", 50).Set("Name", "Phogue") }; var models = MockSimpleModel.FromQuery(item); Assert.AreEqual(50, models.First().Id); Assert.AreEqual("Phogue", models.First().Name); }