public BigModule(IClientFactory clientFactory, ITableNameCache tableNameCache) { Get["/big/tables"] = _ => { var model = new TablesModel(); using (var adminClient = clientFactory.GetAdminClient()) { var tables = adminClient.ListTablesAsync().Result; model.Tables.AddRange(tables.Select(x => new TablesEntryModel { Name = x.Name })); } return(View["Tables.sshtml", model]); }; Get["/big/data/list"] = _ => { var model = new DataListModel { Table = Request.Query["table"], StartKey = Request.Query["skey"], CurrentKey = Request.Query["ckey"], EndKey = Request.Query["ekey"] }; model.SetTableNames(tableNameCache.Names); model.SetMaxRows(Request.Query["maxrows"]); if (string.IsNullOrEmpty(model.CurrentKey)) { model.CurrentKey = model.StartKey; } if (!string.IsNullOrEmpty(model.Table) && !string.IsNullOrEmpty(model.StartKey) && !string.IsNullOrEmpty(model.EndKey)) { using (var dataClient = clientFactory.GetDataClient()) { var table = new BigTable(model.Table); var rows = dataClient.GetRowsAsync(table, model.CurrentKey, model.EndKey, model.MaxRows + 1).Result; foreach (var row in rows) { if (model.KeyCount < model.MaxRows) { model.AddRow(row); } else { model.NextKey = row.KeyString; } } } } return(View["DataList.sshtml", model]); }; Get["/big/data/sample"] = _ => { const string timeSpanFormat = @"hh\:mm\:ss\.ff"; var model = new DataSampleModel { Table = Request.Query["table"] }; model.SetTableNames(tableNameCache.Names); model.SetMaxRows(Request.Query["maxrows"]); if (!string.IsNullOrEmpty(model.Table)) { using (var dataClient = clientFactory.GetDataClient()) { var table = new BigTable(model.Table); Stopwatch watch = Stopwatch.StartNew(); var keys = dataClient.SampleRowKeysAsync(table).Result.ToList(); watch.Stop(); model.SampleElapsed = watch.Elapsed.ToString(timeSpanFormat); model.SampleCount = keys.Count; watch = Stopwatch.StartNew(); foreach (var batch in keys.Take(model.MaxRows).Batch(50)) { var rowTasks = batch .Select(x => new { Task = dataClient.GetRowsAsync(table, x.Key, null, 1), x.KeyString }) .ToArray(); Task.WhenAll(rowTasks.Select(x => x.Task)).Wait(); // silly syntax to avoid resharper warning foreach (var rowset in rowTasks) { if (rowset.Task.Result != null) { var row = rowset.Task.Result.FirstOrDefault(); if (row != null) { model.AddRow(row); } } } } watch.Stop(); model.GetRowsElapsed = watch.Elapsed.ToString(timeSpanFormat); } } return(View["DataSample.sshtml", model]); }; }