/// <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));
/// <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));
/// <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));
/// <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));
/// <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));
/// <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)); }
/// <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));
/// <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));
/// <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));
/// <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); }
/// <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); }