Esempio n. 1
0
        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]);
            };
        }