예제 #1
0
        public static Dictionary <string, Guid> ResolveGuidCode(string baseName, List <string> ids)
        {
            if (ids == null || ids.Count == 0)
            {
                return(null);
            }
            if (string.IsNullOrWhiteSpace(baseName))
            {
                return(null);
            }

            var source = new ConcurrentDictionary <string, Guid>();

            System.Threading.Tasks.Parallel.ForEach(
                ids, (id) =>
            {
                source.AddOrUpdate(id, Guid.Empty, (k, e) => e = Guid.Empty);
            });

            var socket    = null as TSocket;
            var transport = null as TBufferedTransport;
            var data      = new List <TRowResult>();

            // запросим данные GuidCode в Hbase
            try
            {
                // Сделаем вычисление апи хоста по базе данных
                socket    = new TSocket(getHost(baseName, "Href"), Port);
                transport = new TBufferedTransport(socket);
                var proto = new TBinaryProtocol(transport);
                var hbase = new Hbase.Client(proto);

                transport.Open();

                data = hbase.getRowsWithColumns(
                    getBaseTableHbase(baseName, "Href"),
                    ids.Select(id => Dal.GetBytes(id)).ToList(),
                    new List <byte[]>()
                {
                    getAttrNameHbase("Href:GuidCode")
                },
                    null);
            }
            finally
            {
                if (transport != null)
                {
                    transport.Close();
                    transport = null;
                }
            }

            // обработка данных
            System.Threading.Tasks.Parallel.ForEach(
                data, (item) =>
            {
                var key = Convert.ToString(Dal.GetObject(typeof(string), item.Row));
                if (source.ContainsKey(key))
                {
                    source[key] = new Guid(item.Columns.First().Value.Value);
                }
            });

            return(source.ToDictionary(k => k.Key, e => e.Value));
        }
예제 #2
0
        public static Dictionary <object, Dictionary <string, object> > Gets(string baseName, List <object> ids, Dictionary <string, System.Type> attrs)
        {
            if (ids == null || ids.Count == 0)
            {
                return(null);
            }

            var source = new ConcurrentDictionary <object, Dictionary <string, object> >();
            var values = new ConcurrentDictionary <string, object>();

            // Заполним массив возвращаемых по умолчанию
            System.Threading.Tasks.Parallel.ForEach(
                attrs, (item) =>
            {
                var val = Dal.GetDefaultValue(item.Value);
                values.AddOrUpdate(item.Key, val, (k, e) => e = val);
            });

            System.Threading.Tasks.Parallel.ForEach(
                ids, (id) =>
            {
                var val = values.ToDictionary(k => k.Key, e => e.Value);
                source.AddOrUpdate(id, val, (k, e) => e = val);
            });


            if (string.IsNullOrWhiteSpace(baseName))
            {
                return(source.ToDictionary(k => k.Key, e => e.Value));
            }
            if (attrs == null || attrs.Count == 0)
            {
                return(source.ToDictionary(k => k.Key, e => e.Value));
            }

            // Вычисляем Guid`ы по которым нужно получить данные
            var guids         = new HashSet <Guid>(ids.Where(w => w.GetType().Equals(typeof(Guid))).Select(p => (Guid)p));
            var hrefs         = ids.Where(w => !w.GetType().Equals(typeof(Guid))).Select(k => Convert.ToString(k)).ToList();
            var resolve_hrefs = new Dictionary <string, Guid>();

            // Если это не гуид то это доп идентификатор
            if (hrefs.Count > 0)
            {
                resolve_hrefs = ResolveGuidCode(baseName, hrefs);

                foreach (var g in resolve_hrefs)
                {
                    if (!Guid.Empty.Equals(g.Value))
                    {
                        guids.Add(g.Value);
                    }
                }
            }

            // Если Guid`ов нет то и не подключаемся к Hbase
            if (guids.Count == 0)
            {
                return(source.ToDictionary(k => k.Key, e => e.Value));
            }

            var socket    = null as TSocket;
            var transport = null as TBufferedTransport;
            var data      = new List <TRowResult>();

            // запрос данных в Hbase
            try
            {
                // Сделаем вычисление апи хоста по базе данных
                socket    = new TSocket(getHost(baseName, "Node"), Port);
                transport = new TBufferedTransport(socket);
                var proto = new TBinaryProtocol(transport);
                var hbase = new Hbase.Client(proto);

                transport.Open();

                data = hbase.getRowsWithColumns(
                    getBaseTableHbase(baseName, "Node"),
                    guids.Select(p => p.ToByteArray()).ToList(),
                    attrs.Select(p => getAttrNameHbase("Node:" + p.Key)).ToList(),
                    null);
            }
            finally
            {
                if (transport != null)
                {
                    transport.Close();
                    transport = null;
                }
            }

            // обработка полученных данных
            System.Threading.Tasks.Parallel.ForEach(
                data, (row) =>
            {
                var GuidCode = new Guid(row.Row);
                if (GuidCode == Guid.Empty)
                {
                    return;
                }

                var keyRows = new List <object>();

                // Обратный Resolve для Идентификаторов
                if (hrefs.Count > 0 && resolve_hrefs.ContainsValue(GuidCode))
                {
                    keyRows.AddRange(resolve_hrefs.Where(w => w.Value.Equals(GuidCode)).Select(p => (object)p.Key));
                }

                // Если запрос по гуиду то добавляем и его
                if (source.ContainsKey(GuidCode))
                {
                    keyRows.Add(GuidCode);
                }

                System.Threading.Tasks.Parallel.ForEach(
                    keyRows, (k) =>
                {
                    // Обратный Resolve
                    if (!source.ContainsKey(k))
                    {
                        return;
                    }

                    System.Threading.Tasks.Parallel.ForEach(
                        row.Columns, (c) =>
                    {
                        // нужно удалить в название аттрибута Node:
                        var attr = System.Text.Encoding.UTF8.GetString(c.Key).Remove(0, 5);
                        if (source[k].ContainsKey(attr))
                        {
                            source[k][attr] = Dal.GetObject(attrs[attr], c.Value.Value);
                        }
                    });
                });
            });

            return(source.ToDictionary(k => k.Key, e => e.Value));
        }