Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        /// <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;
        }
Ejemplo n.º 5
0
        /// <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;
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        /// <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));
            }
        }
Ejemplo n.º 8
0
        /// <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
                        }
                    }
                );
            }
        }
Ejemplo n.º 9
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
                    }
                }
            );
        }
Ejemplo n.º 10
0
        /// <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
                    }
                }
            );
        }
Ejemplo n.º 11
0
        /// <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));
        }
Ejemplo n.º 12
0
        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));
                }
            }
        }
Ejemplo n.º 13
0
        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);
        }