private static ReqlExpr ResolveMemberExpression( ReqlExpr reqlExpr, MemberExpression expression )
 {
     if( expression.Expression.NodeType == ExpressionType.MemberAccess )
         reqlExpr = ResolveMemberExpression( reqlExpr, (MemberExpression)expression.Expression );
     if( expression.Expression.NodeType == ExpressionType.Extension && expression.Expression is SubQueryExpression )
         reqlExpr = ResolveExtensionExpression( reqlExpr, (SubQueryExpression)expression.Expression );
     return reqlExpr[expression.Member.Name];
 }
        private static ReqlExpr GetWhereReqlAst( ReqlExpr reqlExpr, Expression predicate )
        {
            var subQueryExpression = predicate as SubQueryExpression;
            var where = subQueryExpression.QueryModel.BodyClauses[0] as WhereClause;

            var visitor = new ExpressionVisitor( reqlExpr, subQueryExpression.QueryModel.MainFromClause.ItemType );
            visitor.Visit( where.Predicate );
            return visitor.Current;
        }
 public static ReqlExpr TranslateUnary( ExpressionType type, ReqlExpr term )
 {
     switch( type )
     {
         case ExpressionType.Not:
             return term.Not();
         default:
             throw new NotSupportedException( "Unary term not supported." );
     }
 }
        private static ReqlExpr ResolveExtensionExpression( ReqlExpr reqlExpr, SubQueryExpression expression )
        {
            var subQueryVisitors = new List<ISubQueryVisitor>
            {
                new AnySubQueryVisitor(),
                new AllSubQueryVisitor(),
                new FirstAndLastSubQueryVisitor()
            };

            var subQueryVisitor = subQueryVisitors.FirstOrDefault( x => x.CanVisit( expression.QueryModel ) );

            if( subQueryVisitor == null )
                throw new NotSupportedException( "subqueries not allowed ." );

            return subQueryVisitor.Visit( reqlExpr, expression.QueryModel );
        }
 public static ReqlExpr TranslateBinary( ExpressionType type, ReqlExpr left, ReqlExpr right )
 {
     switch( type )
     {
         case ExpressionType.Equal:
             return left.Eq( right );
         case ExpressionType.NotEqual:
             return left.Eq( right ).Not();
         case ExpressionType.LessThan:
             return left.Lt( right );
         case ExpressionType.LessThanOrEqual:
             return left.Le( right );
         case ExpressionType.GreaterThan:
             return left.Gt( right );
         case ExpressionType.GreaterThanOrEqual:
             return left.Ge( right );
         case ExpressionType.And:
         case ExpressionType.AndAlso:
             return left.And( right );
         case ExpressionType.Or:
         case ExpressionType.OrElse:
             return left.Or( right );
         case ExpressionType.Not:
             throw new InvalidOperationException( "ExpresionType:Not cannot be called on a binary translation." );
         case ExpressionType.Add:
             return left.Add( right );
         case ExpressionType.Subtract:
             return left.Sub( right );
         case ExpressionType.Multiply:
             return left.Mul( right );
         case ExpressionType.Divide:
             return left.Div( right );
         case ExpressionType.Modulo:
             return left.Mod( right );
         default:
             throw new NotSupportedException( "Binary expression not supported." );
     }
 }
 public ReqlExpr Parse( ReqlExpr expression, QueryModel queryModel, Expression predicate )
 {
     return expression.Filter( x => x["reduction"].Contains( reqlExpr => GetWhereReqlAst( reqlExpr, predicate ) ) );
 }
 private static ReqlExpr GetWhereReqlAst( ReqlExpr reqlExpr, Expression predicate )
 {
     var visitor = new ExpressionVisitor( reqlExpr, typeof( bool ) );
     visitor.Visit( predicate );
     return visitor.Current;
 }
 private ReqlExpr IsForbidden(ReqlExpr x)
 {
     return R.Expr(R.Array(1, 2, 3)).Contains(number => number.Eq(x));
 }
 private static ReqlExpr GetWhereReqlAst( ReqlExpr reqlExpr, Expression predicate, QueryModel queryModel )
 {
     var visitor = new ExpressionVisitor( reqlExpr, GetResultType( queryModel ) );
     visitor.Visit( predicate );
     return visitor.Current;
 }
 public ReqlExpr Parse( ReqlExpr expression, QueryModel queryModel, Expression predicate )
 {
     return expression.Filter( reqlExpr => GetWhereReqlAst( reqlExpr, predicate, queryModel ) );
 }
 public ReqlExpr Resolve( ReqlExpr reqlExpr ) => ResolveMemberExpression( reqlExpr, _expression );
示例#12
0
 private ReqlExpr BuildDynamicFilter(ReqlExpr expr, string[] colorSearch)
 {
     var statement = R.Or();
     foreach( var color in colorSearch )
     {
         statement = statement.Or(expr[nameof(Product.ColorCode)].Eq(color));
     }
     return statement;
 }