Ejemplo n.º 1
0
        private object ExecuteMapReduce(MongoQueryObject queryObject)
        {
            var miGetCollection = typeof(IMongoDatabase).GetMethods().Where(m => m.Name == "GetCollection" && m.GetGenericArguments().Length == 1 && m.GetParameters().Length == 1).Single().MakeGenericMethod(queryObject.DocumentType);
            var collection      = miGetCollection.Invoke(queryObject.Database, new[] { queryObject.CollectionName });

            var mapReduce = collection.GetType().GetMethod("MapReduce").Invoke(collection, null);

            var mapReduceCommand = (MapReduceCommand)mapReduce.GetType().GetProperty("Command").GetValue(mapReduce, null);

            mapReduceCommand.Map      = new Code(queryObject.MapFunction);
            mapReduceCommand.Reduce   = new Code(queryObject.ReduceFunction);
            mapReduceCommand.Finalize = new Code(queryObject.FinalizerFunction);
            mapReduceCommand.Query    = queryObject.Query;

            if (queryObject.Sort != null)
            {
                mapReduceCommand.Sort = queryObject.Sort;
            }

            mapReduceCommand.Limit = queryObject.NumberToLimit;

            if (queryObject.NumberToSkip != 0)
            {
                throw new InvalidQueryException("MapReduce queries do no support Skips.");
            }

            var executor = GetExecutor(typeof(Document), queryObject.Projector, queryObject.Aggregator, true);

            return(executor.Compile().DynamicInvoke(mapReduce.GetType().GetProperty("Documents").GetValue(mapReduce, null)));
        }
Ejemplo n.º 2
0
        private object ExecuteFind(MongoQueryObject queryObject)
        {
            var miGetCollection = typeof(IMongoDatabase).GetMethods().Where(m => m.Name == "GetCollection" && m.GetGenericArguments().Length == 1 && m.GetParameters().Length == 1).Single().MakeGenericMethod(queryObject.DocumentType);
            var collection      = miGetCollection.Invoke(queryObject.Database, new[] { queryObject.CollectionName });

            var cursor = collection.GetType().GetMethod("FindAll")
                         .Invoke(collection, null);
            var      cursorType = cursor.GetType();
            Document spec;

            if (queryObject.Sort != null)
            {
                spec = new Document
                {
                    { "query", queryObject.Query },
                    { "orderby", queryObject.Sort }
                };
            }
            else
            {
                spec = queryObject.Query;
            }

            cursorType.GetMethod("Spec", new[] { typeof(Document) }).Invoke(cursor, new object[] { spec });
            if (queryObject.Fields.Count > 0)
            {
                cursorType.GetMethod("Fields", new[] { typeof(Document) }).Invoke(cursor, new object[] { queryObject.Fields });
            }
            cursorType.GetMethod("Limit").Invoke(cursor, new object[] { queryObject.NumberToLimit });
            cursorType.GetMethod("Skip").Invoke(cursor, new object[] { queryObject.NumberToSkip });

            var executor = GetExecutor(queryObject.DocumentType, queryObject.Projector, queryObject.Aggregator, true);

            return(executor.Compile().DynamicInvoke(cursor.GetType().GetProperty("Documents").GetValue(cursor, null)));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Executes the count.
        /// </summary>
        /// <param name="queryObject">The query object.</param>
        /// <returns></returns>
        private object ExecuteCount(MongoQueryObject queryObject)
        {
            var miGetCollection = typeof(IMongoDatabase).GetMethods().Where(m => m.Name == "GetCollection" && m.GetGenericArguments().Length == 1 && m.GetParameters().Length == 1).Single().MakeGenericMethod(queryObject.DocumentType);
            var collection      = miGetCollection.Invoke(queryObject.Database, new[] { queryObject.CollectionName });

            if (queryObject.Query == null)
            {
                return(Convert.ToInt32(collection.GetType().GetMethod("Count", Type.EmptyTypes).Invoke(collection, null)));
            }

            return(Convert.ToInt32(collection.GetType().GetMethod("Count", new[] { typeof(object) }).Invoke(collection, new[] { queryObject.Query })));
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Executes the query object.
 /// </summary>
 /// <param name="queryObject">The query object.</param>
 /// <returns></returns>
 internal object ExecuteQueryObject(MongoQueryObject queryObject)
 {
     if (queryObject.IsCount)
     {
         return(ExecuteCount(queryObject));
     }
     if (queryObject.IsMapReduce)
     {
         return(ExecuteMapReduce(queryObject));
     }
     return(ExecuteFind(queryObject));
 }