Exemplo n.º 1
0
        private Query VisitExpression(Expression expr, string prefix = null)
        {
            try
            {
                // Single: x.Active
                if (expr is MemberExpression && expr.Type == typeof(bool))
                {
                    return(Query.EQ(this.GetField(expr, prefix), new BsonValue(true)));
                }
                // Not: !x.Active or !(x.Id == 1)
                else if (expr.NodeType == ExpressionType.Not)
                {
                    var unary = expr as UnaryExpression;
                    return(Query.Not(this.VisitExpression(unary.Operand, prefix)));
                }
                // Equals: x.Id == 1
                else if (expr.NodeType == ExpressionType.Equal)
                {
                    var bin = expr as BinaryExpression;
                    return(new QueryEquals(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // NotEquals: x.Id != 1
                else if (expr.NodeType == ExpressionType.NotEqual)
                {
                    var bin = expr as BinaryExpression;
                    return(Query.Not(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // LessThan: x.Id < 5
                else if (expr.NodeType == ExpressionType.LessThan)
                {
                    var bin = expr as BinaryExpression;
                    return(Query.LT(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // LessThanOrEqual: x.Id <= 5
                else if (expr.NodeType == ExpressionType.LessThanOrEqual)
                {
                    var bin = expr as BinaryExpression;
                    return(Query.LTE(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // GreaterThan: x.Id > 5
                else if (expr.NodeType == ExpressionType.GreaterThan)
                {
                    var bin = expr as BinaryExpression;
                    return(Query.GT(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // GreaterThanOrEqual: x.Id >= 5
                else if (expr.NodeType == ExpressionType.GreaterThanOrEqual)
                {
                    var bin = expr as BinaryExpression;
                    return(Query.GTE(this.GetField(bin.Left, prefix), this.VisitValue(bin.Right, bin.Left)));
                }
                // And: x.Id > 1 && x.Name == "John"
                else if (expr.NodeType == ExpressionType.AndAlso)
                {
                    var bin   = expr as BinaryExpression;
                    var left  = this.VisitExpression(bin.Left, prefix);
                    var right = this.VisitExpression(bin.Right, prefix);

                    return(Query.And(left, right));
                }
                // Or: x.Id == 1 || x.Name == "John"
                else if (expr.NodeType == ExpressionType.OrElse)
                {
                    var bin   = expr as BinaryExpression;
                    var left  = this.VisitExpression(bin.Left);
                    var right = this.VisitExpression(bin.Right);

                    return(Query.Or(left, right));
                }
                // Constant: do nothing (at this point it's useful only to PredicateBuilder)
                else if (expr.NodeType == ExpressionType.Constant)
                {
                    var constant = expr as ConstantExpression;

                    if (constant.Value is bool)
                    {
                        var value = (bool)constant.Value;

                        return(value ? Query.All() : new QueryEmpty());
                    }
                }
                // Invoke: call inner Lambda expression (used in PredicateBuilder)
                else if (expr.NodeType == ExpressionType.Invoke)
                {
                    var invocation = expr as InvocationExpression;
                    var lambda     = invocation.Expression as LambdaExpression;
                    return(this.VisitExpression(lambda.Body));
                }
                // MethodCall: x.Name.StartsWith("John")
                else if (expr is MethodCallExpression)
                {
                    var met    = expr as MethodCallExpression;
                    var method = met.Method.Name;
// #if HAVE_TYPE_INFO
                    var type = met.Method.DeclaringType;
// #else
//                     var type = met.Method.ReflectedType;
// #endif
                    var paramType = met.Arguments[0] is MemberExpression ?
                                    (ExpressionType?)(met.Arguments[0] as MemberExpression).Expression.NodeType :
                                    null;

                    // StartsWith
                    if (method == "StartsWith")
                    {
                        var value = this.VisitValue(met.Arguments[0], null);

                        return(Query.StartsWith(this.GetField(met.Object, prefix), value));
                    }
                    // Equals
                    else if (method == "Equals")
                    {
                        var value = this.VisitValue(met.Arguments[0], null);

                        return(Query.EQ(this.GetField(met.Object, prefix), value));
                    }
                    // Contains (String): x.Name.Contains("auricio")
                    else if (method == "Contains" && type == typeof(string))
                    {
                        var value = this.VisitValue(met.Arguments[0], null);

                        return(Query.Contains(this.GetField(met.Object, prefix), value));
                    }
                    // Contains (Enumerable): x.ListNumber.Contains(2)
                    else if (method == "Contains" && type == typeof(Enumerable))
                    {
                        var field = this.GetField(met.Arguments[0], prefix);
                        var value = this.VisitValue(met.Arguments[1], null);

                        return(Query.EQ(field, value));
                    }
                    // Any (Enumerable): x.Customer.Any(z => z.Name.StartsWith("John"))
                    else if (method == "Any" && type == typeof(Enumerable) && paramType == ExpressionType.Parameter)
                    {
                        var field  = this.GetField(met.Arguments[0]);
                        var lambda = met.Arguments[1] as LambdaExpression;

                        return(this.VisitExpression(lambda.Body, field + "."));
                    }
                    // System.Linq.Enumerable methods (constant list items)
                    else if (type == typeof(Enumerable))
                    {
                        return(ParseEnumerableExpression(met));
                    }
                }

                return(new QueryLinq <T>(expr, _param, _mapper));
            }
            catch (NotSupportedException)
            {
                // when there is no linq implementation, use QueryLinq
                return(new QueryLinq <T>(expr, _param, _mapper));
            }
        }
Exemplo n.º 2
0
 /// <summary>
 /// Returns if a file exisits in database
 /// </summary>
 public bool Exists(string id)
 {
     return(_engine.Exists(FILES, Query.EQ("_id", id)));
 }
Exemplo n.º 3
0
        private void EntityTracker_EntityUpdated(IEntity obj)
        {
            if (obj is UserEntity entity)
            {
                if (PacketProcessor.Instance.EntityTracker.CompassUser.Id != obj.Id)
                {
                    if (Services.CompassSettings.MarkGuildAsAlly && entity.Relation == RelationType.PK &&
                        entity.GuildName == Services.CompassSettings.MyGuildName)
                    {
                        entity.Relation = RelationType.GuildMember;
                    }
                    PlayerModels[entity.Id] = entity;
                }
            }
            else if (Services.CompassSettings.ShowGatherting && obj is CollectionEntity collection)
            {
                CollectionModels[collection.Id] = collection;
                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        CollectionEntity result = CollectionDatabase.Collection.FindOne(Query.And(Query.EQ("$.Position[0]", collection.Position.X),
                                                                                                  Query.EQ("$.Position[1]", collection.Position.Y), Query.EQ("$.Position[2]", collection.Position.Z)));

                        if (result == null)
                        {
                            CollectionDatabase.Collection.Insert(collection);
                        }
                    }
                    catch (Exception ex)
                    {
                        Trace.Write(ex.ToString());
                    }
                });
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Return entity by _id key. Throws InvalidOperationException if no document
        /// </summary>
        public T SingleById(BsonValue id)
        {
            _query = Query.EQ("_id", id);

            return(this.ToEnumerable().Single());
        }
Exemplo n.º 5
0
        private Query VisitExpression(Expression expr)
        {
            if (expr.NodeType == ExpressionType.Equal) // ==
            {
                var bin = expr as BinaryExpression;
                return(new QueryEquals(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr.NodeType == ExpressionType.NotEqual) // !=
            {
                var bin = expr as BinaryExpression;
                return(Query.Not(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr.NodeType == ExpressionType.LessThan) // <
            {
                var bin = expr as BinaryExpression;
                return(Query.LT(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr.NodeType == ExpressionType.LessThanOrEqual) // <=
            {
                var bin = expr as BinaryExpression;
                return(Query.LTE(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr.NodeType == ExpressionType.GreaterThan) // >
            {
                var bin = expr as BinaryExpression;
                return(Query.GT(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr.NodeType == ExpressionType.GreaterThanOrEqual) // >=
            {
                var bin = expr as BinaryExpression;
                return(Query.GTE(this.VisitMember(bin.Left), this.VisitValue(bin.Right)));
            }
            else if (expr is MethodCallExpression)
            {
                var met    = expr as MethodCallExpression;
                var method = met.Method.Name;

                // StartsWith
                if (method == "StartsWith")
                {
                    var value = this.VisitValue(met.Arguments[0]);

                    return(Query.StartsWith(this.VisitMember(met.Object), value));
                }
                // Contains
                else if (method == "Contains")
                {
                    var value = this.VisitValue(met.Arguments[0]);

                    return(Query.Contains(this.VisitMember(met.Object), value));
                }
                // Equals
                else if (method == "Equals")
                {
                    var value = this.VisitValue(met.Arguments[0]);

                    return(Query.EQ(this.VisitMember(met.Object), value));
                }
            }
            else if (expr is BinaryExpression && expr.NodeType == ExpressionType.AndAlso)
            {
                // AND
                var bin   = expr as BinaryExpression;
                var left  = this.VisitExpression(bin.Left);
                var right = this.VisitExpression(bin.Right);

                return(Query.And(left, right));
            }
            else if (expr is BinaryExpression && expr.NodeType == ExpressionType.OrElse)
            {
                // OR
                var bin   = expr as BinaryExpression;
                var left  = this.VisitExpression(bin.Left);
                var right = this.VisitExpression(bin.Right);

                return(Query.Or(left, right));
            }

            throw new NotImplementedException("Not implemented Linq expression");
        }
Exemplo n.º 6
0
        private Query VisitExpression(Expression expr)
        {
            if (expr.NodeType == ExpressionType.Equal) // ==
            {
                var bin = expr as BinaryExpression;
                return(new QueryEquals(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr is MemberExpression && expr.Type == typeof(bool)) // x.Active
            {
                return(Query.EQ(this.VisitMember(expr), new BsonValue(true)));
            }
            else if (expr.NodeType == ExpressionType.NotEqual) // !=
            {
                var bin = expr as BinaryExpression;
                return(Query.Not(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr.NodeType == ExpressionType.Not) // !x.Active
            {
                var bin = expr as UnaryExpression;
                return(Query.EQ(this.VisitMember(bin), new BsonValue(false)));
            }
            else if (expr.NodeType == ExpressionType.LessThan) // <
            {
                var bin = expr as BinaryExpression;
                return(Query.LT(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr.NodeType == ExpressionType.LessThanOrEqual) // <=
            {
                var bin = expr as BinaryExpression;
                return(Query.LTE(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr.NodeType == ExpressionType.GreaterThan) // >
            {
                var bin = expr as BinaryExpression;
                return(Query.GT(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr.NodeType == ExpressionType.GreaterThanOrEqual) // >=
            {
                var bin = expr as BinaryExpression;
                return(Query.GTE(this.VisitMember(bin.Left), this.VisitValue(bin.Right, bin.Left)));
            }
            else if (expr is MethodCallExpression)
            {
                var met    = expr as MethodCallExpression;
                var method = met.Method.Name;

                // StartsWith
                if (method == "StartsWith")
                {
                    var value = this.VisitValue(met.Arguments[0], null);

                    return(Query.StartsWith(this.VisitMember(met.Object), value));
                }
                // Contains
                else if (method == "Contains")
                {
                    var value = this.VisitValue(met.Arguments[0], null);

                    return(Query.Contains(this.VisitMember(met.Object), value));
                }
                // Equals
                else if (method == "Equals")
                {
                    var value = this.VisitValue(met.Arguments[0], null);

                    return(Query.EQ(this.VisitMember(met.Object), value));
                }
                // System.Linq.Enumerable methods
                else if (met.Method.DeclaringType.FullName == "System.Linq.Enumerable")
                {
                    return(ParseEnumerableExpression(met));
                }
            }
            else if (expr is BinaryExpression && expr.NodeType == ExpressionType.AndAlso)
            {
                // AND
                var bin   = expr as BinaryExpression;
                var left  = this.VisitExpression(bin.Left);
                var right = this.VisitExpression(bin.Right);

                return(Query.And(left, right));
            }
            else if (expr is BinaryExpression && expr.NodeType == ExpressionType.OrElse)
            {
                // OR
                var bin   = expr as BinaryExpression;
                var left  = this.VisitExpression(bin.Left);
                var right = this.VisitExpression(bin.Right);

                return(Query.Or(left, right));
            }

            throw new NotImplementedException("Not implemented Linq expression");
        }