/// <summary> /// Parse and compile string expression and return BsonExpression /// </summary> internal static BsonExpression Parse(Tokenizer tokenizer, BsonExpressionParserMode mode, bool isRoot) { if (tokenizer == null) { throw new ArgumentNullException(nameof(tokenizer)); } var source = Expression.Parameter(typeof(IEnumerable <BsonDocument>), "source"); var root = Expression.Parameter(typeof(BsonDocument), "root"); var current = Expression.Parameter(typeof(BsonValue), "current"); var parameters = Expression.Parameter(typeof(BsonDocument), "parameters"); var expr = mode == BsonExpressionParserMode.Full ? BsonExpressionParser.ParseFullExpression(tokenizer, source, root, current, parameters, isRoot) : mode == BsonExpressionParserMode.Single ? BsonExpressionParser.ParseSingleExpression(tokenizer, source, root, current, parameters, isRoot) : mode == BsonExpressionParserMode.SelectDocument ? BsonExpressionParser.ParseSelectDocumentBuilder(tokenizer, source, root, current, parameters) : BsonExpressionParser.ParseUpdateDocumentBuilder(tokenizer, source, root, current, parameters); // before compile try find in cache if this source already has in cache (already compiled) var cached = _cache.GetOrAdd(expr.Source, (s) => { // compile linq expression (with left+right expressions) Compile(expr, source, root, current, parameters); return(expr); }); return(cached); }
/// <summary> /// Parse and compile string expression and return BsonExpression /// </summary> internal static BsonExpression Parse(Tokenizer tokenizer, BsonExpressionParserMode mode, bool isRoot) { if (tokenizer == null) { throw new ArgumentNullException(nameof(tokenizer)); } var context = new ExpressionContext(); var expr = mode == BsonExpressionParserMode.Full ? BsonExpressionParser.ParseFullExpression(tokenizer, context, isRoot) : mode == BsonExpressionParserMode.Single ? BsonExpressionParser.ParseSingleExpression(tokenizer, context, isRoot) : mode == BsonExpressionParserMode.SelectDocument ? BsonExpressionParser.ParseSelectDocumentBuilder(tokenizer, context) : BsonExpressionParser.ParseUpdateDocumentBuilder(tokenizer, context); // before compile try find in cache if this source already has in cache (already compiled) var cached = _cache.GetOrAdd(expr.Source, (s) => { // compile linq expression (with left+right expressions) Compile(expr, context); return(expr); }); return(cached); }
/// <summary> /// Parse tokenizer and create new instance of BsonExpression - for now, do not use cache /// </summary> internal static BsonExpression Create(Tokenizer tokenizer, BsonExpressionParserMode mode, BsonDocument parameters) { if (tokenizer == null) { throw new ArgumentNullException(nameof(tokenizer)); } return(ParseAndCompile(tokenizer, mode, parameters, DocumentScope.Root)); }
/// <summary> /// Parse and compile string expression and return BsonExpression /// </summary> internal static BsonExpression ParseAndCompile(Tokenizer tokenizer, BsonExpressionParserMode mode, BsonDocument parameters, DocumentScope scope) { if (tokenizer == null) { throw new ArgumentNullException(nameof(tokenizer)); } var context = new ExpressionContext(); var expr = mode == BsonExpressionParserMode.Full ? BsonExpressionParser.ParseFullExpression(tokenizer, context, parameters, scope) : mode == BsonExpressionParserMode.Single ? BsonExpressionParser.ParseSingleExpression(tokenizer, context, parameters, scope) : mode == BsonExpressionParserMode.SelectDocument ? BsonExpressionParser.ParseSelectDocumentBuilder(tokenizer, context, parameters) : BsonExpressionParser.ParseUpdateDocumentBuilder(tokenizer, context, parameters); // compile linq expression (with left+right expressions) Compile(expr, context); return(expr); }
/// <summary> /// Parse tokenizer and create new instance of BsonExpression - for now, do not use cache /// </summary> internal static BsonExpression Create(Tokenizer tokenizer, BsonDocument parameters, BsonExpressionParserMode mode) { if (tokenizer == null) { throw new ArgumentNullException(nameof(tokenizer)); } var expr = Parse(tokenizer, mode, true); // return a copy from cache using new Parameters return(new BsonExpression { Expression = expr.Expression, IsImmutable = expr.IsImmutable, UseSource = expr.UseSource, IsScalar = expr.IsScalar, Parameters = parameters ?? new BsonDocument(), Fields = expr.Fields, Left = expr.Left, Right = expr.Right, Source = expr.Source, Type = expr.Type, _func = expr._func, _funcScalar = expr._funcScalar }); }