Example #1
0
 /// <summary>
 /// Count documents matching a query. This method does not deserialize any document. Needs indexes on query expression
 /// </summary>
 public int Count(string predicate, params BsonValue[] args) => this.Count(BsonExpression.Create(predicate, args));
Example #2
0
 /// <summary>
 /// Count documents matching a query. This method does not deserialize any documents. Needs indexes on query expression
 /// </summary>
 public long LongCount(string predicate, BsonDocument parameters) => this.LongCount(BsonExpression.Create(predicate, parameters));
Example #3
0
 /// <summary>
 /// Returns true if query returns any document. This method does not deserialize any document. Needs indexes on query expression
 /// </summary>
 public bool Exists(string predicate, BsonDocument parameters) => this.Exists(BsonExpression.Create(predicate, parameters));
Example #4
0
 /// <summary>
 /// Returns true if query returns any document. This method does not deserialize any document. Needs indexes on query expression
 /// </summary>
 public bool Exists(string predicate, params BsonValue[] args) => this.Exists(BsonExpression.Create(predicate, args));
Example #5
0
 /// <summary>
 /// Find all files that match with predicate expression.
 /// </summary>
 public IEnumerable <LiteFileInfo <TFileId> > Find(string predicate, params BsonValue[] args) => this.Find(BsonExpression.Create(predicate, args));
Example #6
0
        /// <summary>
        /// [ EXPLAIN ]
        ///    SELECT {selectExpr}
        ///    [ INTO {newcollection|$function} [ : {autoId} ] ]
        ///    [ FROM {collection|$function} ]
        /// [ INCLUDE {pathExpr0} [, {pathExprN} ]
        ///   [ WHERE {filterExpr} ]
        ///   [ GROUP BY {groupByExpr} ]
        ///  [ HAVING {filterExpr} ]
        ///   [ ORDER BY {orderByExpr} [ ASC | DESC ] ]
        ///   [ LIMIT {number} ]
        ///  [ OFFSET {number} ]
        ///     [ FOR UPDATE ]
        /// </summary>
        private IBsonDataReader ParseSelect()
        {
            // initialize query definition
            var query = new Query();

            var token = _tokenizer.ReadToken();

            query.ExplainPlan = token.Is("EXPLAIN");

            if (query.ExplainPlan)
            {
                token = _tokenizer.ReadToken();
            }

            token.Expect("SELECT");

            // read required SELECT <expr> and convert into single expression
            query.Select = BsonExpression.Create(_tokenizer, BsonExpressionParserMode.SelectDocument, _parameters);

            // read FROM|INTO
            var from = _tokenizer.ReadToken();

            if (from.Type == TokenType.EOF || from.Type == TokenType.SemiColon)
            {
                // select with no FROM - just run expression (avoid DUAL table, Mr. Oracle)
                //TODO: i think will be better add all sql into engine
                var result = query.Select.Execute(_collation.Value);

                var defaultName = "expr";

                return(new BsonDataReader(result.Select(x => x.IsDocument ? x.AsDocument : new BsonDocument {
                    [defaultName] = x
                }), null));
            }
            else if (from.Is("INTO"))
            {
                query.Into       = ParseCollection(_tokenizer);
                query.IntoAutoId = this.ParseWithAutoId();

                _tokenizer.ReadToken().Expect("FROM");
            }
            else
            {
                from.Expect("FROM");
            }

            // read FROM <name>
            var collection = ParseCollection(_tokenizer);

            var ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("INCLUDE"))
            {
                // read first INCLUDE (before)
                _tokenizer.ReadToken();

                foreach (var path in this.ParseListOfExpressions())
                {
                    query.Includes.Add(path);
                }
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("WHERE"))
            {
                // read WHERE keyword
                _tokenizer.ReadToken();

                var where = BsonExpression.Create(_tokenizer, BsonExpressionParserMode.Full, _parameters);

                query.Where.Add(where);
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("GROUP"))
            {
                // read GROUP BY keyword
                _tokenizer.ReadToken();
                _tokenizer.ReadToken().Expect("BY");

                var groupBy = BsonExpression.Create(_tokenizer, BsonExpressionParserMode.Full, _parameters);

                query.GroupBy = groupBy;

                ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

                if (ahead.Is("HAVING"))
                {
                    // read HAVING keyword
                    _tokenizer.ReadToken();

                    var having = BsonExpression.Create(_tokenizer, BsonExpressionParserMode.Full, _parameters);

                    query.Having = having;
                }
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("ORDER"))
            {
                // read ORDER BY keyword
                _tokenizer.ReadToken();
                _tokenizer.ReadToken().Expect("BY");

                var orderBy = BsonExpression.Create(_tokenizer, BsonExpressionParserMode.Full, _parameters);

                var orderByOrder = Query.Ascending;
                var orderByToken = _tokenizer.LookAhead();

                if (orderByToken.Is("ASC") || orderByToken.Is("DESC"))
                {
                    orderByOrder = _tokenizer.ReadToken().Is("ASC") ? Query.Ascending : Query.Descending;
                }

                query.OrderBy = orderBy;
                query.Order   = orderByOrder;
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("LIMIT"))
            {
                // read LIMIT keyword
                _tokenizer.ReadToken();
                var limit = _tokenizer.ReadToken().Expect(TokenType.Int).Value;

                query.Limit = Convert.ToInt32(limit);
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("OFFSET"))
            {
                // read OFFSET keyword
                _tokenizer.ReadToken();
                var offset = _tokenizer.ReadToken().Expect(TokenType.Int).Value;

                query.Offset = Convert.ToInt32(offset);
            }

            ahead = _tokenizer.LookAhead().Expect(TokenType.Word, TokenType.EOF, TokenType.SemiColon);

            if (ahead.Is("FOR"))
            {
                // read FOR keyword
                _tokenizer.ReadToken();
                _tokenizer.ReadToken().Expect("UPDATE");

                query.ForUpdate = true;
            }

            // read eof/;
            _tokenizer.ReadToken().Expect(TokenType.EOF, TokenType.SemiColon);

            return(_engine.Query(collection, query));
        }
Example #7
0
 /// <summary>
 /// Find all files that match with predicate expression.
 /// </summary>
 public IEnumerable <LiteFileInfo <TFileId> > Find(string predicate, BsonDocument parameters) => this.Find(BsonExpression.Create(predicate, parameters));
Example #8
0
 /// <summary>
 /// Delete all documents based on predicate expression. Returns how many documents was deleted
 /// </summary>
 public int DeleteMany(string predicate, params BsonValue[] args) => this.DeleteMany(BsonExpression.Create(predicate, args));
Example #9
0
 /// <summary>
 /// Delete all documents based on predicate expression. Returns how many documents was deleted
 /// </summary>
 public int DeleteMany(string predicate, BsonDocument parameters) => this.DeleteMany(BsonExpression.Create(predicate, parameters));
Example #10
0
 /// <summary>
 /// Filters a sequence of documents based on a predicate expression
 /// </summary>
 public ILiteQueryable <T> Where(string predicate, params BsonValue[] args)
 {
     _query.Where.Add(BsonExpression.Create(predicate, args));
     return(this);
 }
Example #11
0
 /// <summary>
 /// Filters a sequence of documents based on a predicate expression
 /// </summary>
 public ILiteQueryable <T> Where(string predicate, BsonDocument parameters)
 {
     _query.Where.Add(BsonExpression.Create(predicate, parameters));
     return(this);
 }