Example #1
0
        public string Select(string input)
        {
            if (!Opened)
            {
                return(JsonConvert.SerializeObject(new { ok = false, total = 0, count = 0, msg = "The model " + Model + " is closed" }));
            }

            long   _total         = Count();
            string msg_field_null = JsonConvert.SerializeObject(new
            {
                ok    = false,
                total = _total,
                count = 0,
                msg   = "The data of QueryString is NULL. It has format: model=test&action=select&skip=0&limit=10&_op.1=eq&_id.1=8499849689d044a7a5b0ffe9&_andor.1=and&_op.2=eq&___dc.2=20180303"
            });

            if (string.IsNullOrEmpty(input))
            {
                return(msg_field_null);
            }

            //input = "model=test&action=select&skip=0&limit=10&" +
            //    "f.1=_id&o.1=eq&v.1=b67cb5e92b6c45e0bab345b2" +
            //    "&or=2.3" +
            //    "&f.2=___dc&o.2=eq&v.2=20180303" +
            //    "&f.3=___dc&o.3=eq&v.3=20180303";

            var a = input.Split('&')
                    .Select(x => x.Split('='))
                    .Where(x => x.Length > 1)
                    .Select(x => new { key = x[0], value = x[1] })
                    .ToArray();

            if (a.Length != a.Select(x => x.key).Distinct().ToArray().Length)
            {
                return(JsonConvert.SerializeObject(new { ok = false, total = _total, count = 0, msg = "The keys of QueryString duplicated" }));
            }

            string _or = a.Where(x => x.key == "or").Select(x => x.value).SingleOrDefault();
            var    ws  = a
                         .Where(x => x.key.Contains('.') && x.key.Split('.')[1].IsNumeric())
                         .Select(x => new QueryItem(x.key.Split('.')[0], int.Parse(x.key.Split('.')[1]), x.value, _or))
                         .ToArray();

            int[]        aCmdOR = ws.Where(x => x.isOr).Select(x => x.cmd).Distinct().ToArray();
            QueryBuilder _query = null;
            List <Query> lsOr   = new List <Query>()
            {
            };

            for (int i = 0; i < aCmdOR.Length; i++)
            {
                var    ai        = ws.Where(x => x.cmd == aCmdOR[i]).ToArray();
                string _field    = ai.Where(x => x.field == "f").Select(x => x.value).SingleOrDefault();
                string _operator = ai.Where(x => x.field == "o").Select(x => x.value).SingleOrDefault();
                string _value    = ai.Where(x => x.field == "v").Select(x => x.value).SingleOrDefault();
                if (string.IsNullOrEmpty(_field) || string.IsNullOrEmpty(_operator))
                {
                    return(msg_field_null);
                }
                _query = convertQuery(_field, _operator, _value);
                if (_query.Ok && _query.Query != null)
                {
                    lsOr.Add(_query.Query);
                }
                else
                {
                    return(JsonConvert.SerializeObject(new { ok = false, total = _total, count = 0, msg = _query.Msg }));
                }
            }

            int[]        aCmdAnd = ws.Where(x => x.isOr == false).Select(x => x.cmd).Distinct().ToArray();
            List <Query> lsAnd   = new List <Query>()
            {
            };

            for (int i = 0; i < aCmdAnd.Length; i++)
            {
                var    ai        = ws.Where(x => x.cmd == aCmdAnd[i]).ToArray();
                string _field    = ai.Where(x => x.field == "f").Select(x => x.value).SingleOrDefault();
                string _operator = ai.Where(x => x.field == "o").Select(x => x.value).SingleOrDefault();
                string _value    = ai.Where(x => x.field == "v").Select(x => x.value).SingleOrDefault();
                if (string.IsNullOrEmpty(_field) || string.IsNullOrEmpty(_operator))
                {
                    return(msg_field_null);
                }
                _query = convertQuery(_field, _operator, _value);
                if (_query.Ok && _query.Query != null)
                {
                    lsAnd.Add(_query.Query);
                }
                else
                {
                    return(JsonConvert.SerializeObject(new { ok = false, total = _total, count = 0, msg = _query.Msg }));
                }
            }

            Dictionary <string, BsonDocument> dicStore = new Dictionary <string, BsonDocument>()
            {
            };
            IEnumerable <KeyValuePair <string, BsonDocument> > rsFind;

            switch (lsOr.Count)
            {
            case 0:
                break;

            case 1:
                rsFind = _engine.FindCacheIDs(_LITEDB_CONST.COLLECTION_NAME, lsOr[0]).ToArray();
                foreach (var kv in rsFind)
                {
                    if (!dicStore.ContainsKey(kv.Key))
                    {
                        dicStore.Add(kv.Key, kv.Value);
                    }
                }
                break;

            default:
                rsFind = _engine.FindCacheIDs(_LITEDB_CONST.COLLECTION_NAME, Query.Or(lsOr.ToArray())).ToArray();
                foreach (var kv in rsFind)
                {
                    if (!dicStore.ContainsKey(kv.Key))
                    {
                        dicStore.Add(kv.Key, kv.Value);
                    }
                }
                break;
            }

            switch (lsAnd.Count)
            {
            case 0:
                break;

            case 1:
                rsFind = _engine.FindCacheIDs(_LITEDB_CONST.COLLECTION_NAME, lsAnd[0]).ToArray();
                foreach (var kv in rsFind)
                {
                    if (!dicStore.ContainsKey(kv.Key))
                    {
                        dicStore.Add(kv.Key, kv.Value);
                    }
                }
                break;

            default:
                rsFind = _engine.FindCacheIDs(_LITEDB_CONST.COLLECTION_NAME, Query.And(lsAnd.ToArray())).ToArray();
                foreach (var kv in rsFind)
                {
                    if (!dicStore.ContainsKey(kv.Key))
                    {
                        dicStore.Add(kv.Key, kv.Value);
                    }
                }
                break;
            }

            var jobject = a.Where(x => !x.key.Contains("."))
                          .GroupBy(x => x.key).Select(x => x.First())
                          .ToDictionary(x => x.key, x => x.value);
            string skip, limit;

            jobject.TryGetValue("skip", out skip);
            jobject.TryGetValue("limit", out limit);

            long _skip  = 0;
            long _limit = 0;

            long.TryParse(skip, out _skip);
            long.TryParse(limit, out _limit);

            if (_skip < 0)
            {
                _skip = _LITEDB_CONST._SKIP;
            }
            if (_limit <= 0)
            {
                _limit = _LITEDB_CONST._LIMIT;
            }

            string[]      allID  = dicStore.Keys.ToArray();
            string[]      idRs   = allID.Skip(_skip).Take(_limit).ToArray();
            List <string> result = new List <string>();

            foreach (string id in idRs)
            {
                result.Add(dicStore[id].toJson);
            }

            //var result = _engine
            //    //.Find(_LITEDB_CONST.COLLECTION_NAME, Query.In(_LITEDB_CONST.FIELD_ID, idRs))
            //    .Find(_LITEDB_CONST.COLLECTION_NAME, Query.Where(_LITEDB_CONST.FIELD_ID, _id => listID.IndexOf(_id) != -1))
            //    .Select(x => x.toJson).ToArray();

            return(@"{""ok"":true,""total"":" + _total.ToString() + @",""count"":" + result.Count.ToString() + @",""items"":[" + string.Join(",", result.ToArray()) + @"]}");
        }