public QueryParts Parse(string query) { var hash = _hashProvider.Create(query).ToString("X"); if (_parsedQueries.ContainsKey(hash)) { return(_parsedQueries[hash]); } var cleanQuery = CleanAndFormatQueryText(query); var commentResult = _queryParser.StripComments(cleanQuery); cleanQuery = commentResult.commentFreeQuery; var typeAndBody = _queryParser.ParseQueryBody(cleanQuery); var qp = new QueryParts { VariableName = _queryParser.ParseVariables(cleanQuery), QueryBody = typeAndBody.queryBody.Trim(), QueryType = typeAndBody.queryType.Trim(), QueryFrom = _queryParser.ParseFromBody(cleanQuery).Trim(), QueryWhere = _queryParser.ParseWhere(cleanQuery).Trim(), RollbackName = _queryParser.ParseRollback(cleanQuery).Trim(), TransactionId = _queryParser.ParseTransaction(cleanQuery).Trim(), QueryOrderBy = _queryParser.ParseOrderBy(cleanQuery).Trim(), QueryJoin = _queryParser.ParseJoins(cleanQuery).Trim(), Comments = commentResult.comments, OrginalQuery = query, CollectionName = _queryParser.GetCollectionName(cleanQuery) }; switch (typeAndBody.queryType.Trim()) { case Constants.QueryParsingKeywords.SELECT: qp.QueryOffset = _queryParser.ParseOffsetLimit(cleanQuery).Trim(); qp.QueryGroupBy = _queryParser.ParseGroupBy(cleanQuery).Trim(); break; case Constants.QueryParsingKeywords.UPDATE: var updateTypeAndBody = _queryParser.ParseUpdateBody(cleanQuery); qp.QueryUpdateBody = updateTypeAndBody.updateBody.Trim(); qp.QueryUpdateType = updateTypeAndBody.updateType.Trim(); qp.QueryOrderBy = string.Empty; qp.QueryJoin = string.Empty; break; case Constants.QueryParsingKeywords.INSERT: qp.QueryInto = _queryParser.ParseIntoBody(cleanQuery).Trim(); qp.QueryFrom = string.Empty; qp.QueryOrderBy = string.Empty; qp.QueryJoin = string.Empty; break; } _parsedQueries.Add(hash, qp); return(qp); }