/// <summary> /// Initializes a new instance of the <see cref="QueryItem"/> class. /// </summary> /// <param name="entry">The entry to generate the query from.</param> public QueryItem(DocumentEntry entry) { _key = entry.Key; if (entry.ValueType != DocumentEntryType.Document) { _parts.Add(new QueryItemPart(QueryItemPartType.Equal, entry)); return; } foreach (var item in entry.ValueAsDocument) { GenerateQueryItem(item.Key, item.Value); } }
/// <summary> /// Checks if a is less then or equal to b. /// </summary> /// <param name="a">The left side of the operator.</param> /// <param name="b">The right side of the operator.</param> /// <returns>The result of the operator.</returns> private bool LessThenEqualTo(DocumentEntry a, DocumentEntry b) { if (a.ValueType != b.ValueType) { return(false); } switch (a.ValueType) { case DocumentEntryType.Float: return(a.ValueAsFloat <= b.ValueAsFloat); case DocumentEntryType.Integer: return(a.ValueAsInteger <= b.ValueAsInteger); case DocumentEntryType.String: return(string.Compare(a.ValueAsString, b.ValueAsString, StringComparison.Ordinal) <= 0); default: return(false); } }
/// <summary> /// Checks if a is greater then b. /// </summary> /// <param name="a">The left side of the operator.</param> /// <param name="b">The right side of the operator.</param> /// <returns>The result of the operator.</returns> private bool GreaterThen(DocumentEntry a, DocumentEntry b) { if (a.ValueType != b.ValueType) { return(false); } switch (a.ValueType) { case DocumentEntryType.Float: return(a.ValueAsFloat > b.ValueAsFloat); case DocumentEntryType.Integer: return(a.ValueAsInteger > b.ValueAsInteger); case DocumentEntryType.String: return(string.Compare(a.ValueAsString, b.ValueAsString, StringComparison.Ordinal) > 0); default: return(false); } }
/// <summary> /// Initializes a new instance of the <see cref="QueryItemPart"/> struct. /// </summary> /// <param name="type">The type of the value.</param> /// <param name="value">The value to be compared against.</param> public QueryItemPart(QueryItemPartType type, DocumentEntry value) : this() { Type = type; Value = value; }
/// <summary> /// Generates a query item from a document entry and adds it to the parts list. /// </summary> /// <param name="key">The entry's key.</param> /// <param name="value">The entry's value.</param> private void GenerateQueryItem(string key, DocumentEntry value) { switch (key) { case "lt": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Boolean || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"lt\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.LessThen, value)); break; case "lte": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Boolean || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"lte\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.LessThenEqualTo, value)); break; case "eq": _parts.Add(new QueryItemPart(QueryItemPartType.Equal, value)); break; case "neq": _parts.Add(new QueryItemPart(QueryItemPartType.NotEqual, value)); break; case "gt": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Boolean || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"gt\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.GreaterThen, value)); break; case "gte": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Boolean || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"gte\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.GreaterThenEqualTo, value)); break; case "in": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"in\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.Contains, value)); break; case "nin": if (value.ValueType == DocumentEntryType.Array || value.ValueType == DocumentEntryType.Document) { throw new QueryException("DocumentEntryType \"" + Enum.GetName(typeof(DocumentEntryType), value.ValueType) + "\" is not supported on the \"nin\" query."); } _parts.Add(new QueryItemPart(QueryItemPartType.NotContains, value)); break; default: throw new QueryException("Invalid query entry."); } }