/// <summary> /// Parses the list of databases. /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseDatabases(IDatabaseObject query) { return query.Where(statement => statement is Builders.Database).Select(database => this.ParseDatabase(database as Builders.Database)).ToList(); }
protected virtual List<String> ParseSortings(IDatabaseObject query) { return query.Where(sort => sort is Sort).Select(sort => this.ParseSort(sort as Sort)).ToList(); }
/// <summary> /// Parses the list of indexes /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseIndices(IDatabaseObject query) { return query.Where(statement => statement is Index).Union(new List<IDatabaseObject>() { query }.Where(owner => owner is Index)).Select(index => this.ParseIndex(index as Index)).Where(index => String.IsNullOrEmpty(index) == false).ToList(); }
/// <summary> /// Parse any logicals /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseLogicals(IDatabaseObject query) { List<String> logicals = new List<String>(); foreach (Logical logical in query.Where(logical => logical is Logical)) { String separator = logical is Or ? " OR " : " AND "; String childLogicals = String.Join(separator, this.ParseLogicals(logical)); String childEqualities = String.Join(separator, this.ParseEqualities(logical)); if (String.IsNullOrEmpty(childLogicals) == false) logicals.Add(String.Format("({0})", childLogicals)); if (String.IsNullOrEmpty(childEqualities) == false) logicals.Add(String.Format("({0})", childEqualities)); } return logicals; }
/// <summary> /// Parse field assignments, similar to conditions, but without the conditionals. /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseAssignments(IDatabaseObject query) { List<String> assignments = new List<String>(); foreach (Assignment assignment in query.Where(statement => statement is Assignment)) { Field field = assignment.FirstOrDefault(statement => statement is Field) as Field; Value value = assignment.FirstOrDefault(statement => statement is Value) as Value; if (field != null && value != null) { assignments.Add(String.Format("{0} = {1}", this.ParseField(field), this.ParseValue(value))); } } return assignments; }
/// <summary> /// Loops on query, adding each as it's own new element /// </summary> /// <param name="query"></param> /// <param name="outer"></param> /// <returns></returns> protected virtual JArray ParseEqualities(IDatabaseObject query, JArray outer) { foreach (Equality equality in query.Where(statement => statement is Equality)) { outer.Add(this.ParseEquality(equality, new JObject())); } return outer; }
protected virtual List<String> ParseEqualities(IDatabaseObject query) { List<String> equalities = new List<String>(); foreach (Equality equality in query.Where(statement => statement is Equality)) { Field field = equality.FirstOrDefault(statement => statement is Field) as Field; Value value = equality.FirstOrDefault(statement => statement is Value) as Value; if (field != null && value != null) { equalities.Add(String.Format("{0} {1} {2}", this.ParseField(field), this.ParseEquality(equality), this.ParseValue(value))); } } return equalities; }
protected virtual List<String> ParseValues(IDatabaseObject query) { return query.Where(statement => statement is Value).Select(value => this.ParseValue(value as Value)).ToList(); }
protected virtual List<String> ParseFields(IDatabaseObject query) { List<String> parsed = new List<String>(); // If we have a distinct field, but no specific fields if (query.Any(attribute => attribute is Distinct) == true && query.Any(logical => logical is Field) == false) { parsed.Add("DISTINCT *"); } // If we have a distinct field and only one field available else if (query.Any(attribute => attribute is Distinct) == true && query.Count(logical => logical is Field) == 1) { Field field = query.First(logical => logical is Field) as Field; if (field != null) { field.Add(query.First(attribute => attribute is Distinct)); parsed.Add(this.ParseField(field)); } } // Else, no distinct in the global query space else { parsed.AddRange(query.Where(logical => logical is Field).Select(field => this.ParseField(field as Field))); } return parsed; }
/// <summary> /// Parse field assignments, similar to conditions, but without the conditionals. /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseAssignments(IDatabaseObject query) { DocumentValue document = new DocumentValue(); document.AddRange(query.Where(statement => statement is Assignment)); return new List<String>() { new JArray() { new JObject() { new JProperty("$set", document.ToJObject()) } }.ToString(Formatting.None) }; }
protected virtual List<String> ParseSortings(IDatabaseObject query) { JObject sortings = new JObject(); foreach (Sort sort in query.Where(sort => sort is Sort)) { this.ParseSort(sort, sortings); } return new List<String>() { new JArray() { sortings }.ToString(Formatting.None) }; }
/// <summary> /// Parse any logicals /// </summary> /// <param name="query"></param> /// <param name="outer"></param> /// <returns></returns> protected virtual JObject ParseLogicals(IDatabaseObject query, JObject outer) { foreach (Logical logical in query.Where(logical => logical is Logical)) { outer[this.ParseLogical(logical)] = new JArray(); this.ParseEqualities(logical, outer[this.ParseLogical(logical)] as JArray); this.ParseLogicals(logical, outer[this.ParseLogical(logical)] as JArray); } this.ParseEqualities(query, outer); return outer; }
/// <summary> /// Parse logics, adding them to the current array as a new object. /// </summary> /// <param name="query"></param> /// <param name="outer"></param> /// <returns></returns> protected virtual JArray ParseLogicals(IDatabaseObject query, JArray outer) { foreach (Logical logical in query.Where(logical => logical is Logical)) { outer.Add(this.ParseLogicals(logical, new JObject())); } return outer; }
/// <summary> /// Loops on query, adding/updating all queries on the single outer JObject /// </summary> /// <param name="query"></param> /// <param name="outer"></param> /// <returns></returns> protected virtual JObject ParseEqualities(IDatabaseObject query, JObject outer) { foreach (Equality equality in query.Where(statement => statement is Equality)) { this.ParseEquality(equality, outer); } return outer; }
/// <summary> /// Fetches the numeric value from a skip object /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual long? ParseSkip(IDatabaseObject query) { return query.Where(skip => skip is Skip && skip.Any(value => value is NumericValue)).Select(skip => ((NumericValue)skip.First(value => value is NumericValue)).Long).FirstOrDefault(); }
/// <summary> /// Parse collections for all methods, used like "FROM ..." /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual List<String> ParseCollections(IDatabaseObject query) { return query.Where(logical => logical is Collection).Select(collection => this.ParseCollection(collection as Collection)).ToList(); }
/// <summary> /// Fetches the numeric value from a limit object /// </summary> /// <param name="query"></param> /// <returns></returns> protected virtual long? ParseLimit(IDatabaseObject query) { return query.Where(limit => limit is Limit && limit.Any(value => value is NumericValue)).Select(limit => ((NumericValue)limit.First(value => value is NumericValue)).Long).FirstOrDefault(); }
protected virtual List<String> ParseFields(IDatabaseObject query) { return query.Where(logical => logical is Field).Select(field => this.ParseField(field as Field)).ToList(); }