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)); }
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)); }
static void _Sets(string baseName, List <Row> rows, DateTime transaction_date) { if (string.IsNullOrWhiteSpace(baseName)) { return; } if (rows == null || rows.Count == 0) { return; } if (rows.Count == 1 && rows.First().Значения.Count == 0 && rows.First().ИдентификаторыОбъекта.Count == 0) { return; } // данные для отправки в Hbase var dataNode = new List <global::BatchMutation>(); var dataHref = new List <global::BatchMutation>(); System.Threading.Tasks.Parallel.ForEach(rows, (r) => { // массив значений if (r.Значения.Count > 0) { dataNode.Add( new global::BatchMutation() { Row = r.GuidCode.ToByteArray(), Mutations = r.Значения.Select( p => new global::Mutation() { IsDelete = false, Column = getAttrNameHbase("Node:" + p.Key), Value = Dal.GetBytes(p.Value) }).ToList() }); } // массив идентификаторов if (r.ИдентификаторыОбъекта.Count > 0) { dataHref.AddRange( r.ИдентификаторыОбъекта.Select( k => new global::BatchMutation() { Row = Dal.GetBytes(k), Mutations = r.Значения.Select( p => new global::Mutation() { IsDelete = false, Column = getAttrNameHbase("Href:GuidCode"), Value = r.GuidCode.ToByteArray() }).ToList() }).ToList()); } }); // отправим данные паралельно System.Threading.Tasks.Parallel.Invoke( () => { _Sets_hbase(baseName, "Node", transaction_date, dataNode); }, () => { _Sets_hbase(baseName, "Href", transaction_date, dataHref); }); }