using System.Collections; using System.Collections.Generic; using Newtonsoft.Json; using LeanCloud.Storage.Internal.Codec; namespace LeanCloud.Storage.Internal.Query { public class LCCompositionalCondition : ILCQueryCondition { public const string And = "$and"; public const string Or = "$or"; readonly string composition; List conditionList; List orderByList; HashSet includes; HashSet selectedKeys; public int Skip { get; set; } public int Limit { get; set; } public LCCompositionalCondition(string composition = And) { this.composition = composition; Skip = 0; Limit = 30; } // 查询条件 public void WhereEqualTo(string key, object value) { Add(new LCEqualCondition(key, value)); } public void WhereNotEqualTo(string key, object value) { AddOperation(key, "$ne", value); } public void WhereContainedIn(string key, IEnumerable values) { AddOperation(key, "$in", values); } public void WhereNotContainedIn(string key, IEnumerable values) { AddOperation(key, "nin", values); } public void WhereContainsAll(string key, IEnumerable values) { AddOperation(key, "$all", values); } public void WhereExists(string key) { AddOperation(key, "$exists", true); } public void WhereDoesNotExist(string key) { AddOperation(key, "$exists", false); } public void WhereSizeEqualTo(string key, int size) { AddOperation(key, "$size", size); } public void WhereGreaterThan(string key, object value) { AddOperation(key, "$gt", value); } public void WhereGreaterThanOrEqualTo(string key, object value) { AddOperation(key, "$gte", value); } public void WhereLessThan(string key, object value) { AddOperation(key, "$lt", value); } public void WhereLessThanOrEqualTo(string key, object value) { AddOperation(key, "$lte", value); } public void WhereNear(string key, LCGeoPoint point) { AddOperation(key, "$nearSphere", point); } public void WhereWithinGeoBox(string key, LCGeoPoint southwest, LCGeoPoint northeast) { Dictionary value = new Dictionary { { "$box", new List { southwest, northeast } } }; AddOperation(key, "$within", value); } public void WhereRelatedTo(LCObject parent, string key) { Add(new LCRelatedCondition(parent, key)); } public void WhereStartsWith(string key, string prefix) { AddOperation(key, "$regex", $"^{prefix}.*"); } public void WhereEndsWith(string key, string suffix) { AddOperation(key, "$regex", $".*{suffix}$"); } public void WhereContains(string key, string subString) { AddOperation(key, "$regex", $".*{subString}.*"); } void AddOperation(string key, string op, object value) { LCOperationCondition cond = new LCOperationCondition(key, op, value); Add(cond); } public void Add(ILCQueryCondition cond) { if (cond == null) { return; } if (conditionList == null) { conditionList = new List(); } conditionList.RemoveAll(item => item.Equals(cond)); conditionList.Add(cond); } // 筛选条件 public void OrderBy(string key) { if (orderByList == null) { orderByList = new List(); } orderByList.Add(key); } public void OrderByDescending(string key) { OrderBy($"-{key}"); } public void Include(string key) { if (includes == null) { includes = new HashSet(); } includes.Add(key); } public void Select(string key) { if (selectedKeys == null) { selectedKeys = new HashSet(); } selectedKeys.Add(key); } public bool Equals(ILCQueryCondition other) { return false; } public Dictionary Encode() { if (conditionList == null || conditionList.Count == 0) { return null; } if (conditionList.Count == 1) { ILCQueryCondition cond = conditionList[0]; return cond.Encode(); } return new Dictionary { { composition, LCEncoder.Encode(conditionList) } }; } public Dictionary BuildParams() { Dictionary dict = new Dictionary { { "skip", Skip }, { "limit", Limit } }; if (conditionList != null && conditionList.Count > 0) { dict["where"] = JsonConvert.SerializeObject(Encode()); } if (orderByList != null && orderByList.Count > 0) { dict["order"] = string.Join(",", orderByList); } if (includes != null && includes.Count > 0) { dict["include"] = string.Join(",", includes); } if (selectedKeys != null && selectedKeys.Count > 0) { dict["keys"] = string.Join(",", selectedKeys); } return dict; } public string BuildWhere() { if (conditionList == null || conditionList.Count == 0) { return null; } return JsonConvert.SerializeObject(Encode()); } } }