예제 #1
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        public void Load(TableInfo table_info)
        {
            this.row_map = table_info.DataMap;

            foreach (string index in table_info.Index)
            {
                this.index_map[index] = new IndexData();
            }

            this.ReflushIndex();
        }
예제 #2
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        public Dictionary <string, string> Select(string condition)
        {
            RowMap search_row_map            = this.Filter(condition, "Select", false);
            Dictionary <string, string> data = new Dictionary <string, string>();

            foreach (KeyValuePair <string, RowData> pair in search_row_map)
            {
                data[pair.Key] = this.RowDataToJson(pair.Value);
            }
            return(data);
        }
예제 #3
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        public Dictionary <string, string> Delete(string condition)
        {
            RowMap search_row_map            = this.Filter(condition, "Delete", true);
            Dictionary <string, string> data = new Dictionary <string, string>();

            foreach (KeyValuePair <string, RowData> pair in search_row_map)
            {
                this.row_map.Remove(pair.Key);
                this.OnRemoveRowData(pair.Key, pair.Value);
                data[pair.Key] = this.RowDataToJson(pair.Value);
            }
            return(data);
        }
예제 #4
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        public Dictionary <string, string> Update(string condition, string json)
        {
            RowMap search_row_map            = this.Filter(condition, "Update", true);
            Dictionary <string, string> data = new Dictionary <string, string>();

            foreach (KeyValuePair <string, RowData> pair in search_row_map)
            {
                this.OnRemoveRowData(pair.Key, this.row_map[pair.Key]);
                this.row_map[pair.Key] = this.JsonToRowData(json);
                this.OnAddRowData(pair.Key, this.row_map[pair.Key]);
                data[pair.Key] = this.RowDataToJson(this.row_map[pair.Key]);
            }
            return(data);
        }
예제 #5
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        private RowMap Filter(string condition, string handle, bool is_warn = false)
        {
            JObject cond = (JObject)JsonConvert.DeserializeObject(condition);

            RowMap search_row_map = new RowMap();

            //有指定UID先筛选
            if (cond.ContainsKey("UID"))
            {
                JObject target = (JObject)JsonConvert.DeserializeObject(cond["UID"].ToString());
                if (target["op"].ToString().Equals("=="))
                {
                    string uid = target["value"].ToString();
                    if (!this.row_map.ContainsKey(uid))
                    {
                        if (is_warn)
                        {
                            throw new Exception(string.Format("{0} Table:{1} Error | Not Exist Uid:{2}", handle, this.table_name, uid));
                        }
                        return(search_row_map);
                    }
                    search_row_map[uid] = this.row_map[uid];
                }
                else
                {
                    search_row_map = this.row_map;
                }
            }
            else
            {
                search_row_map = this.row_map;
            }

            //筛选条件先与后或
            if (cond.Count > (cond.ContainsKey("$or") ? 1 : 0))
            {
                search_row_map = this.FilterCondition(search_row_map, cond, true);
            }

            if (cond.ContainsKey("$or") && ((JObject)cond["$or"]).Count > 0)
            {
                search_row_map = this.FilterCondition(search_row_map, (JObject)cond["$or"], false);
            }

            return(search_row_map);
        }
예제 #6
0
파일: TableData.cs 프로젝트: a3562351/XMDB
        private RowMap FilterCondition(RowMap search_row_map, JObject cond, bool and_cond)
        {
            bool need_check = false;

            //先用索引筛选一遍
            RowMap and_filter_map = search_row_map;
            RowMap or_filter_map  = new RowMap();

            foreach (KeyValuePair <string, JToken> pair in cond)
            {
                if (!pair.Key.Equals("$or"))
                {
                    string value = pair.Value.ToString();
                    if (this.index_map.ContainsKey(pair.Key))
                    {
                        if (!this.index_map[pair.Key].ContainsKey(value))
                        {
                            //与条件筛选出的数据为空
                            if (and_cond)
                            {
                                return(new RowMap());
                            }
                        }
                        else
                        {
                            RowMap filter_row_map = new RowMap();
                            foreach (string uid in this.index_map[pair.Key][value])
                            {
                                if (search_row_map.ContainsKey(uid))
                                {
                                    if (and_cond)
                                    {
                                        if (and_filter_map.ContainsKey(uid))
                                        {
                                            filter_row_map[uid] = this.row_map[uid];
                                        }
                                    }
                                    else
                                    {
                                        or_filter_map[uid] = this.row_map[uid];
                                    }
                                }
                            }
                            and_filter_map = filter_row_map;
                        }
                    }
                    else
                    {
                        need_check = true;
                    }
                }
            }

            //存在没有索引的条件,需要遍历判断
            if (need_check)
            {
                RowMap filter_row_map = new RowMap();
                foreach (KeyValuePair <string, RowData> pair in search_row_map)
                {
                    string uid = pair.Key;
                    if (this.CheckCondition(uid, pair.Value, cond, and_cond))
                    {
                        filter_row_map[uid] = this.row_map[uid];
                    }
                }
                search_row_map = filter_row_map;
            }
            return(search_row_map);
        }