Exemple #1
0
        private RqlExpression VisitOperatorSize(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                ThrowError(node, "{0} takes exactly two arguments", node.Name);
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "First argument must be an identifier");
            }

            RqlConstantExpression constant = node.Arguments[1] as RqlConstantExpression;

            if (constant == null || constant.Value.GetType() != typeof(int))
            {
                ThrowError(node.Arguments[1], "Second argument must be an integer constant");
            }

            sb.Append("{");
            VisitIdentifier(identifier);
            sb.Append("{$");
            sb.Append(node.Name);
            sb.Append(": ");
            VisitConstant(constant);
            sb.Append("}");
            sb.Append("}");
            return(node);
        }
Exemple #2
0
        private RqlExpression VisitOperatorEq(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                ThrowError(node, "Equality takes exactly two arguments");
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "First argument must be a field identifier");
            }

            RqlConstantExpression constant = node.Arguments[1] as RqlConstantExpression;

            if (constant == null)
            {
                ThrowError(node, "Second argument must be a constant");
            }

            sb.Append("{");
            VisitIdentifier(identifier);
            VisitConstant(constant);
            sb.Append("}");
            return(node);
        }
Exemple #3
0
        private RqlExpression VisitOperatorLikeLikei(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                ThrowError(node, "{0} takes exactly two arguments", node.Name);
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "First argument must be an identifier");
            }

            RqlConstantExpression constant = node.Arguments[1] as RqlConstantExpression;

            if (constant == null || constant.Value.GetType() != typeof(string))
            {
                ThrowError(node, "Second argument must be a string constant");
            }

            bool ignoreCase = (identifier.Name == "likei");

            sb.Append("{");
            VisitIdentifier(identifier);
            sb.AppendFormat(@"/\b{0}/{1}", Regex.Escape((string)((RqlConstantExpression)node.Arguments[1]).Value), ignoreCase ? "i" : "");
            sb.Append("}");
            return(node);
        }
Exemple #4
0
        private RqlExpression VisitOperatorInNinAll(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                ThrowError(node, String.Format("{0} needs two arguments", node.Name));
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "First argument must be a field identifier");
            }

            RqlTupleExpression        tuple    = node.Arguments[1] as RqlTupleExpression;
            RqlFunctionCallExpression funcCall = node.Arguments[1] as RqlFunctionCallExpression;

            // TODO: Need a way to find the return types of operators
            if (tuple == null && !(funcCall != null && (funcCall.Name == "where" || funcCall.Name == "ids")))
            {
                ThrowError(node.Arguments[1], "Second argument must be a tuple or an expression returning a tuple");
            }

            sb.Append("{");

            VisitIdentifier(identifier);
            sb.Append("{$");
            sb.Append(node.Name);
            sb.Append(": ");
            Visit(node.Arguments[1]);
            sb.Append("}");
            sb.Append("}");
            return(node);
        }
Exemple #5
0
        private RqlExpression VisitOperatorNeGtGteLtLte(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                ThrowError(node, String.Format("{0} takes exactly two arguments", node.Name));
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "First argument must be a field identifier");
            }

            RqlConstantExpression constant = node.Arguments[1] as RqlConstantExpression;

            if (constant == null)
            {
                ThrowError(node, "Second argument must be a constant");
            }

            sb.Append("{");
            VisitIdentifier(identifier);
            sb.Append("{$");
            sb.Append(node.Name);
            sb.Append(": ");
            VisitConstant(constant);
            sb.Append("}");
            sb.Append("}");
            return(node);
        }
Exemple #6
0
        protected override RqlExpression VisitIdentifier(RqlIdentifierExpression node)
        {
            sb.Append("\"");
            sb.Append(MongoNameFixer.Field(node.Name));
            sb.Append("\": ");

            return(node);
        }
Exemple #7
0
        private RqlExpression VisitOperatorExistsNexists(RqlFunctionCallExpression node)
        {
            if (node.Arguments.Count != 1)
            {
                ThrowError(node, "{0} takes exactly one argument", node.Name);
            }

            RqlIdentifierExpression identifier = node.Arguments[0] as RqlIdentifierExpression;

            if (identifier == null)
            {
                ThrowError(node.Arguments[0], "Argument must be an identifier");
            }

            bool exists = (node.Name == "exists");

            sb.Append("{");
            VisitIdentifier(identifier);
            sb.Append("{$");
            sb.Append(node.Name);
            sb.AppendFormat(": {0} }}", exists ? "true" : "false");
            sb.Append("}");
            return(node);
        }
Exemple #8
0
        protected override RqlExpression VisitIdentifier(RqlIdentifierExpression node)
        {
            s += node.Name;

            return(node);
        }