Changeset 11030


Ignore:
Timestamp:
06/20/14 16:20:02 (5 years ago)
Author:
mroscoe
Message:
 
Location:
branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3
Files:
3 added
10 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml

    r11020 r11030  
    3737}
    3838
    39 @helper UserTaskStats(string destinationTag, string overallUrl, string userUrl, string userName, string start, string end)
     39@helper UserTaskStats(string destinationTag, string url, string userName, string start, string end)
    4040{
    41   if(userName!="") {
     41  if (userName != "" || userName != null) {
    4242    <text>
    4343      $.ajax({
    44         url: "@(new HtmlString(overallUrl))?start=" + @start + "&end=" + @end, datatype: "json", success: function (overallResult) {
     44        url: "@(new HtmlString(url))?start=" + @start + "&end=" + @end, datatype: "json", success: function (overallResult) {
    4545          $.ajax({
    46             url: "@(new HtmlString(userUrl))?userName=" + @userName + "&start=" + @start + "&end=" + @end, datatype: "json", success: function (userResult) {
     46            url: "@(new HtmlString(url))?start=" + @start + "&end=" + @end + "&userName=" + @userName, datatype: "json", success: function (userResult) {
    4747              $("#" + "@destinationTag").html("");
    4848              for (var i = 0; i < userResult.length; i++) {
    4949                $("#" + "@destinationTag").append('<label class="barLabel">' + userResult[i].Key + '</label>');
    50                 $("#" + "@destinationTag").append('<div class="outerBar"><div class="innerBar" id="InnerBar' + i + '"><p class="innerBarText">' + +userResult[i].Value.toFixed(4) + '</p></div><p class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].toFixed(4) + '</p></div>');
    51                 $("#InnerBar" + i).css('width',((userResult[i].Value/overallResult[i])*100).toFixed(2) + '%');
    52                 $("#OuterText" + i).css('width',(98 - ((userResult[i].Value/overallResult[i])*100)).toFixed(2) + '%');
     50                $("#" + "@destinationTag").append('<div class="outerBar"><div class="innerBar" id="InnerBar' + i + '"><label class="innerBarText">' + +userResult[i].Value.toFixed(4) + '</label></div></div><label class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].Value.toFixed(4) + '</label>');
     51                $("#InnerBar" + i).css('width',((userResult[i].Value/overallResult[i].Value)*100).toFixed(2) + '%');
    5352              }
    5453            }
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml

    r11020 r11030  
    110110}
    111111
    112 @helper TasksForUser(string container, string destinationTag, string url, string userName, string startDate = null, string endDate = null)
    113 {
    114   <text>
    115     $.ajax({url: "@(new HtmlString(url))?userName=" + @(userName) + "&start=" + @startDate + "&end=" + @endDate, datatype: "json", success: function(result) {
    116       $("#@container").html("");
    117       if(result[0].length==0) {
     112@helper TasksForUser(string container, string destinationTag, string pageUrl, string taskUrl, string functionName, string userName, string limit, string startDate = null, string endDate = null, string jobId=null, string taskState=null, string pageNumber=null)
     113{
     114  <text>
     115    var GetRequest = "?userName=" + @(userName) + "&limit=" + @(limit);
     116    @if(startDate!=null) {
     117      @:if(@(startDate)!=null) {
     118        @:GetRequest += "&start=" + @startDate;
     119      @:}
     120    }
     121    @if(endDate!=null) {
     122      @:if(@(endDate)!=null) {
     123        @:GetRequest += "&end=" + @endDate;
     124      @:}
     125    }
     126    @if(jobId!=null) {
     127      @:if(@(jobId)!=null) {
     128        @:GetRequest += "&jobId=" + @jobId;
     129      @:}
     130    }
     131    @if(taskState!=null) {
     132      @:if(@(taskState)!=null) {
     133        @:GetRequest += "&taskState=" + @taskState;
     134      @:}
     135    }
     136    $.ajax({async: false, url: "@(new HtmlString(pageUrl))" + GetRequest, datatype: "json", success: function(result) {
     137      if(result > 1) {
     138        $("#@container").append('<label class="pageTitle">Page: </label>')
     139        for(var i=0; i < result; i++) {
     140          $("#" + "@container").append('<a id="Page' + (i + 1) + '" class="page">' + (i + 1) + '</a>')
     141        }
     142        if(@pageNumber != null) {
     143          $("#Page" + @pageNumber).css('color','#F7921D');
     144        }
     145        else {
     146          $("#Page1").css('color','#F7921D');
     147        }
     148      }
     149    }});
     150    @if(pageNumber!=null) {
     151      @:if(@(pageNumber)!=null) {
     152        @:GetRequest += "&currentPage=" + @pageNumber;
     153      @:}
     154    }
     155    $.ajax({url: "@(new HtmlString(taskUrl))" + GetRequest, datatype: "json", success: function(result) {
     156      if(result.Key.length==0) {
    118157        $("#@container").append(
    119           '<section class="chartContainer"><h1 class="title">' + @userName + ' has no tasks for the given time period!</h1></section>'
     158          '<section class="chartContainer"><h1 class="title">' + @userName + ' has no tasks for the specified filters!</h1></section>'
    120159        )
    121160      }
     
    126165
    127166      //Globally accesible, for use when resizing, eliminates extra DB request
    128       window["numberTasks"] = result[0].length;
     167      window["numberTasks"] = result.Key.length;
     168
     169      //Set display of all errors to none, errors matching the tasks will be reset below
     170      $(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','none');
    129171
    130172      //For each result create a seperate collapsable section with a chart and info label
    131       for(var i = 0; i < result[0].length; i++){
     173      for(var i = 0; i < result.Key.length; i++){
    132174        $("#" + "@container").append(
    133           '<section class="chartContainer"><h1 class="title">Task ' + (i + 1) +
    134           '</h1><button class="collapse" onclick="collapseSection(this)">-</button><div id="@(destinationTag)' + i +
     175          '<section class="chartContainer"><h1 class="title" id="' + result.Key[i] + '">Task ' + result.Key[i] +
     176          '</h1><button class="collapse" onclick="collapseSection(this)">+</button><div id="@(destinationTag)' + i +
    135177          '"></div><label id="@(destinationTag)' + i + 'Info"></label></section>'
    136178        )
    137         waitTime = [result[0][i]];
    138         transferTime = [result[1][i]];
    139         runTime = [result[2][i]];
     179        $(".errorTask").each(function() {
     180          if($(this).html()==result.Key[i]) {
     181            $("#" + result.Key[i]).css("color","red");
     182            $("#" + result.Key[i]).append(" - ERROR");
     183            $(".errorContainer, .errorTitle, .underline").css('display','inline-block');
     184            $(this).css('display','inline-block');
     185            $(this).next().css('display','inline-block');
     186          }
     187        });
     188        waitTime = [result.Value[0][i]];
     189        transferTime = [result.Value[1][i]];
     190        runTime = [result.Value[2][i]];
    140191        window["@(destinationTag)Plot" + i] = $.jqplot("@destinationTag" + i, [waitTime,transferTime,runTime], {
    141           //stackSeries: true,
    142192          seriesDefaults:{
    143193            renderer:$.jqplot.BarRenderer,
    144194            shadowAngle: 135,
    145             //rendererOptions: {
    146             //  barDirection: 'horizontal'
    147             //},
    148195            pointLabels: {show: true, formatString: '%.3f'}
    149196          },
     
    176223        $("#" + "@(destinationTag)" + i).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
    177224          $("#" + $(this).attr('id') + "Info").html(seriesDescriptions[seriesIndex] + ': ' + data[1]);
    178         });
     225        });
     226
     227        window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
     228
     229        $('#@destinationTag' + i).contextmenu(function() {
     230          window["@(destinationTag)Plot" + i].resetZoom();
     231          window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
     232          return false;
     233        });
     234
     235        collapsedByDefault(document.getElementById("@(destinationTag)" + i));
    179236      }
    180237    }});
     238
     239    $(".page").click(function () {
     240      pageNumber = $(this).html();
     241      @(functionName)();
     242    });
    181243  </text>
    182244}
     
    187249  $(window).resize(function() {
    188250    for(var i = 0; i < numberTasks; i++) {
    189       window[ "@(destinationTag)Plot" + i].replot({ resetAxes: true });
     251      $.each(window[ "@(destinationTag)Plot" + i].series, function(index, series) {
     252        series.barWidth = undefined;
     253      });
     254      window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
    190255    }
    191256  });
    192257  </text>
    193258}
    194 
    195 @* OLD SMOOTHIE CHART FUNCTIONS *@
    196 @*@helper CreateSmoothieChart(string destinationTag, string stroke, string fill, string label)
    197 {
    198   <text>
    199     var @(destinationTag)Smoothie = new SmoothieChart({
    200       grid: {
    201         strokeStyle: '@stroke', fillStyle: '@fill',
    202         lineWidth: 1, millisPerLine: 450, verticalSections: 4,
    203       },
    204       labels: {
    205         fillStyle: '@label'
    206       }
    207     });
    208 
    209     var @(destinationTag)TimeSeries = new Array()
    210   </text>
    211 }
    212 
    213 @helper SetSmoothieCanvas(string destinationTag, string delay)
    214 {
    215   <text>
    216   @(destinationTag)Smoothie.streamTo(document.getElementById("@destinationTag"), @delay);
    217   </text>
    218 }
    219 
    220 @helper AssignTimeSeries(string seriesName, string destinationTag, string stroke, string fill)
    221 {
    222   <text>
    223   var @(seriesName)TS = new TimeSeries();
    224   @(destinationTag)Smoothie.addTimeSeries(@(seriesName)TS, { strokeStyle: '@stroke', fillStyle: '@fill', lineWidth: 3 });
    225   @(destinationTag)TimeSeries.push(@(seriesName)TS);
    226   </text>
    227 }
    228 
    229 @helper UpdateChartData(string destinationTag, string url)
    230 {
    231   <text>
    232   $.ajax({
    233     url: '@(url)', datatype: "json", success: function (result) {
    234       var i
    235       for (i = 0; i < @(destinationTag)TimeSeries.length; i++) {
    236         @(destinationTag)TimeSeries[i].append(new Date().getTime(), result[i]);
    237       }
    238     }
    239   });
    240   </text>
    241 }*@
    242259
    243260@helper SetStreamingProperties(int refresh, int chartLength, int upperY) {
     
    376393  </text>
    377394}
    378 
    379 @helper MakeCollapsable()
    380 {
    381   <text>
    382   $(document).ready(function() {
    383     $(".collapse").click(function () {
    384       if ($(this).html() == "-") {
    385         $(this).parent().children("canvas, div, fieldset, label").fadeOut();
    386         $(this).html("+");
    387       }
    388       else {
    389         $(this).parent().children("canvas, div, fieldset, label").fadeIn();
    390         $(this).html("-");
    391       }
    392     });
    393   });
    394   </text>
    395 }
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css

    r11020 r11030  
    3939body > div {
    4040  max-width: 1000px;
     41  min-width: 680px;
    4142  margin: 0 auto;
    4243  padding: 0;
     
    4445  border-radius: 8px;
    4546  box-shadow: 1px 1px 5px 1px rgba(0, 0, 0, 0.35);
     47}
     48
     49#ui-datepicker-div {
     50  min-width: 0px;
    4651}
    4752
     
    6166}
    6267
     68/* Error container styles */
     69.errorContainer {
     70  width: 95%;
     71  margin: 1% 0% 2% 2%;
     72  -webkit-border-radius: 10px;
     73  border-radius: 10px;
     74  border: 3px solid #FF270A;
     75  display: none;
     76}
     77
     78.errorTitle {
     79  width: 100%;
     80  padding-left: 2%;
     81  margin-bottom: 0%;
     82  color: #FF5640;
     83  font-size: 1.4em;
     84}
     85
     86.errorTask, .errorMessage {
     87  width: 40%;
     88  margin: 0% 0% 1% 0%;
     89  font-size: 1.3em;
     90  color: #FF5640;
     91  display: inline-block;
     92}
     93
     94.errorTask {
     95  margin-left: 2%;
     96}
     97
     98a.errorTask {
     99  cursor: pointer;
     100}
     101
     102.underline {
     103  text-decoration: underline;
     104  margin-top: 1.5%;
     105}
     106
     107#ScrollTop {
     108  width: 40px;
     109  height: 40px;
     110  position: absolute;
     111  right: 20px;
     112  top: 20px;
     113  background: none;
     114  color: #F7921D;
     115  -webkit-border-radius: 3px;
     116  -moz-border-radius: 3px;
     117  border-radius: 3px;
     118  border: 2px solid #F7921D;
     119  text-align: center;
     120  font-size: 14pt;
     121  display: none;
     122}
     123
     124#ScrollTop:hover {
     125  background-color: rgba(247,146,29,0.42);
     126}
     127
    63128/* Progress bar styles */
    64129.barLabel {
     
    72137.outerBar {
    73138  height: 25px;
    74   width: 80%;
     139  width: 75%;
    75140  margin-left: 10%;
    76141  border: 2px outset grey;
     142  display: inline-block;
    77143}
    78144
     
    109175
    110176.outerBarText {
    111   text-align: right;
     177  width: 5%;
     178  text-align: left;
     179}
     180
     181/* Tabular Diplay Styles */
     182.tabButton {
     183  margin: 3% 0% 0% 0%;
     184  background: none;
     185  color: #707070;
     186  font-size: 1.4em;
     187  -webkit-border-radius: 0 3px 0 0;
     188  border-radius: 0 5px 0 0;
     189  border: 1px solid #8297F5;
     190  text-align: center;
     191  z-index: 3;
     192}
     193
     194.tabButton:hover {
     195  background-color: #D1D9FF;
     196}
     197
     198.tabButton:focus {
     199  -webkit-border-radius: 0 3px 0 0;
     200  border-radius: 0 5px 0 0;
     201  border-bottom: 1px solid #FAFAFA;
     202}
     203
     204.tabSection {
     205  width: 90%;
     206  padding: 1%;
     207  margin: 0% 0% 3% 3%;
     208  -webkit-border-radius: 0 15px 15px 15px;
     209  border-radius: 0 15px 15px 15px;
     210  -webkit-box-shadow: 5px 5px 3px #A3A3A2;
     211  box-shadow: 5px 5px 3px #A3A3A2;
     212  border: 1px solid #8297F5;
     213  display: none;
     214}
     215
     216.tabDataContainer {
     217  width: 99%;
     218  display: inline-block;
     219}
     220
     221.taskOverview {
     222  width: 70%;
     223}
     224
     225.tabButton:first-of-type {
     226  border-bottom: 1px solid #E0E6FF;
     227  background-color: #E0E6FF;
     228  margin-left: 3%;
     229}
     230
     231.tabSection:first-of-type {
     232  display: block;
     233}
     234
     235/* Multi-page Task Styles */
     236.pageTitle, .page {
     237  margin-right: 1%;
     238  font-size: 1.8em;
     239  color: #6B6B6B;
     240}
     241
     242.pageTitle {
     243  margin-left: 2%;
     244}
     245
     246.page {
     247  text-decoration: underline;
     248  cursor: pointer;
     249}
     250
     251.page:hover {
     252  color: #F7921D;
    112253}
    113254
     
    316457}
    317458/* User Page Styles*/
    318 #tasksContainer div[id^="Task"] {
     459#TasksContainer div[id^="Task"] {
    319460  margin: 2% 0%;
    320461}
    321462
    322 #tasksContainer .jqplot-xaxis {
     463#TasksContainer .jqplot-xaxis {
    323464  display: none;
    324465}
     
    330471}
    331472
    332 #filters {
     473#FilterChoices {
     474  width: 15%;
     475  padding: 0% 2% 1% 2%;
     476  vertical-align: top;
     477}
     478
     479#FilterChoices label {
     480  width: 75%;
     481}
     482
     483#FilterChoices label:last-of-type {
     484  width: 50%;
     485}
     486
     487#FilterChoices input[type="checkbox"] {
     488  margin: .4em;
     489}
     490
     491#FilterChoices input[type="checkbox"], #FilterChoices label, #Filters label, #Filters input {
     492  font-size: 1.5em;
     493  display: inline-block;
     494}
     495
     496#FilterChoices legend, #Filters legend {
     497  font-size: 1.5em;
     498}
     499
     500#Filters, #FilterChoices{
    333501  margin: 2% 2% 3% 2%;
    334 }
    335 
    336 #filters legend, #filters label, #filters input {
    337   font-size: 1.6em;
     502  display: inline-block;
     503}
     504
     505#Filters {
     506  width: 71%;
     507  margin: 2% 0% 2% 0%;
     508}
     509
     510#TaskOverviewFilterFirst {
     511  margin-top: 0%;
     512}
     513
     514.filterContainer {
     515  width: 28%;
     516  margin: 0% 0% 1% 1%;
     517  vertical-align: top;
     518  display: none;
     519}
     520
     521.filterContainer:first-of-type {
     522  margin-left: 2%;
     523  display: inline-block;
     524}
     525
     526.filterContainer input, .filterContainer select, .filterContainer label {
     527  width: 90%;
     528  margin-left: 5%;
     529}
     530
     531#Filters button{
     532  margin: 1% 0% 1% 2%;
     533  display: block;
    338534}
    339535
    340536/* Admin Page Styles */
    341 [id$="OverviewButton"] {
    342   margin: 3% 0% 0% 0%;
    343   background: none;
    344   color: #707070;
    345   font-size: 1.4em;
    346   -webkit-border-radius: 0 3px 0 0;
    347   border-radius: 0 5px 0 0;
    348   border: 1px solid #8297F5;
    349   text-align: center;
    350   z-index: 3;
    351 }
    352 
    353 #UserOverviewButton {
    354   border-bottom: 1px solid #E0E6FF;
    355   background-color: #E0E6FF;
    356   margin-left: 3%;
    357 }
    358 
    359 [id$="OverviewButton"]:hover {
    360   background-color: #D1D9FF;
    361 }
    362 
    363 [id$="OverviewButton"]:focus {
    364   -webkit-border-radius: 0 3px 0 0;
    365   border-radius: 0 5px 0 0;
    366   border-bottom: 1px solid #FAFAFA;
    367 }
    368 
    369 [id$="OverviewTab"] {
    370   width: 90%;
    371   padding: 1%;
    372   margin: 0% 0% 3% 3%;
    373   -webkit-border-radius: 0 15px 15px 15px;
    374   border-radius: 0 15px 15px 15px;
    375   -webkit-box-shadow: 5px 5px 3px #A3A3A2;
    376   box-shadow: 5px 5px 3px #A3A3A2;
    377   border: 1px solid #8297F5;
    378   display: none;
    379 }
    380 
    381 #UserOverviewTab {
    382   display: block;
     537.usersField #FilterChoices {
     538  width: 92%;
     539  margin: 1% 0% 1% 2%;
     540}
     541
     542.usersField #FilterChoices legend {
     543  font-size: 1em;
     544  padding-top: 6%;
     545}
     546
     547.usersField #FilterChoices label {
     548  font-size: 1em;
     549  width: 60%;
     550  margin: 0% 0% 0% 10%;
     551}
     552
     553.usersField #FilterChoices label:last-of-type {
     554  width: 42%;
     555}
     556
     557.usersField #FilterChoices label:last-of-type {
     558  margin-bottom: 8%;
     559}
     560
     561.usersField #FilterChoices input[type="checkbox"] {
     562  margin: .3em;
     563}
     564
     565#UserOverviewTab #Filters {
     566  width: 67%;
     567  margin: 1% 0% 0% 2%;
     568}
     569
     570.tabSection .filterContainer {
     571  width: 27%;
    383572}
    384573
     
    402591  margin-top: 1em;
    403592}
    404 
    405 .adminDataContainer {
    406   width: 70%;
    407   padding-left: 1%;
    408   display: inline-block;
    409 }
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs

    r11020 r11030  
    2424    }
    2525
    26     public JsonResult UserTaskStats(string userName, DateTime start, DateTime end)
     26    public JsonResult TaskStats(DateTime start, DateTime end, string userName=null)
    2727    {
    2828      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
     
    3131                        join jobs in db.DimJobs
    3232                          on tasks.JobId equals jobs.JobId
    33                         where jobs.UserName == userName &&
    34                         tasks.StartTime >= start &&
    35                         tasks.EndTime < end
     33                        where tasks.StartTime >= start &&
     34                        tasks.EndTime < end &&
     35                        (string.IsNullOrEmpty(userName) || jobs.UserName == userName)
    3636                        select new { tasks.TotalWaitingTime, tasks.TotalTransferTime, tasks.TotalRuntime, tasks.NumCalculationRuns,
    3737                          tasks.CoresRequired, tasks.MemoryRequired, tasks.TaskSize, tasks.ResultSize})
     
    5151      }
    5252    }
    53 
    54     public JsonResult AllTaskStats(DateTime start, DateTime end)
    55     {
    56       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
    57       {
    58         var taskStats = (from tasks in db.FactTasks
    59                          where tasks.StartTime >= start &&
    60                          tasks.EndTime < end
    61                          select new
    62                          {
    63                            tasks.TotalWaitingTime,
    64                            tasks.TotalTransferTime,
    65                            tasks.TotalRuntime,
    66                            tasks.NumCalculationRuns,
    67                            tasks.CoresRequired,
    68                            tasks.MemoryRequired,
    69                            tasks.TaskSize,
    70                            tasks.ResultSize
    71                          })
    72                           .ToList();
    73 
    74         List<double> FullStats = new List<double>();
    75         FullStats.Add(taskStats.Sum(w => w.TotalWaitingTime));
    76         FullStats.Add(taskStats.Sum(t => t.TotalTransferTime));
    77         FullStats.Add(taskStats.Sum(r => r.TotalRuntime));
    78         FullStats.Add(taskStats.Sum(n => n.NumCalculationRuns));
    79         FullStats.Add(taskStats.Sum(c => c.CoresRequired));
    80         FullStats.Add(taskStats.Sum(m => m.MemoryRequired));
    81         FullStats.Add(taskStats.Sum(ts => ts.TaskSize));
    82         FullStats.Add(taskStats.Sum(rs => Convert.ToDouble(rs.ResultSize)));
    83 
    84         return Json(FullStats, JsonRequestBehavior.AllowGet);
    85       }
    86     }
    8753  }
    8854}
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs

    r11020 r11030  
    139139    }
    140140
    141     public JsonResult GetUserTask(string userName, DateTime? start = null, DateTime? end = null)
    142     {
    143       start = start ?? DateTime.Now - DefaultDuration;
    144       end = end ?? DateTime.Now;
    145       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
    146       {
    147         var data =
     141    public JsonResult NumberPages(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState = null)
     142    {
     143      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
     144      {
     145        TaskState state = GetTaskState(taskState);
     146        var numberRecords =
    148147          (from tasks in db.FactTasks
    149           join jobs in db.DimJobs
    150             on tasks.JobId equals jobs.JobId
    151           where jobs.UserName == userName &&
    152           tasks.StartTime >= start &&
    153           tasks.EndTime < end
    154           select new
    155           {
    156             TotalWaiting = tasks.TotalWaitingTime,
    157             TotalTransfer = tasks.TotalTransferTime,
    158             TotalRuntime = tasks.TotalRuntime
    159           }).ToList();
    160 
    161         List<List<double>> overallResult = new List<List<double>>();
     148           join jobs in db.DimJobs
     149             on tasks.JobId equals jobs.JobId
     150           where jobs.UserName == userName &&
     151           (!start.HasValue || tasks.StartTime >= start) &&
     152           (!end.HasValue || tasks.EndTime < end) &&
     153           (string.IsNullOrEmpty(jobId) || tasks.JobId.ToString() == jobId) &&
     154           (string.IsNullOrEmpty(taskState) || tasks.TaskState == state)
     155           select new
     156           {
     157             TaskID = tasks.TaskId,
     158             TotalWaiting = tasks.TotalWaitingTime,
     159             TotalTransfer = tasks.TotalTransferTime,
     160             TotalRuntime = tasks.TotalRuntime,
     161             StartDate = tasks.StartTime
     162           }).OrderByDescending(s => s.StartDate).ToList().Count;
     163
     164        var numberPages = numberRecords / Convert.ToDecimal(limit);
     165        numberPages = Decimal.Truncate(numberPages);
     166        numberPages += 1;
     167
     168        return Json(numberPages, JsonRequestBehavior.AllowGet);
     169      }
     170    }
     171
     172    public JsonResult GetUserTask(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState=null, string currentPage=null)
     173    {
     174      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
     175      {
     176        TaskState state = GetTaskState(taskState);
     177        var data =
     178          (from tasks in db.FactTasks
     179           join jobs in db.DimJobs
     180             on tasks.JobId equals jobs.JobId
     181           where jobs.UserName == userName &&
     182           (!start.HasValue || tasks.StartTime >= start) &&
     183           (!end.HasValue || tasks.EndTime < end) &&
     184           (string.IsNullOrEmpty(jobId) || tasks.JobId.ToString() == jobId) &&
     185           (string.IsNullOrEmpty(taskState) || tasks.TaskState == state)
     186           select new
     187           {
     188             TaskID = tasks.TaskId,
     189             TotalWaiting = tasks.TotalWaitingTime,
     190             TotalTransfer = tasks.TotalTransferTime,
     191             TotalRuntime = tasks.TotalRuntime,
     192             StartDate = tasks.StartTime
     193           }).OrderByDescending(s => s.StartDate).ToList();
     194
     195        if (currentPage != null) {
     196          data.RemoveRange(0, (Convert.ToInt32(currentPage) - 1) * Convert.ToInt32(limit));
     197          if (data.Count > Convert.ToInt32(limit)) {
     198            data.RemoveRange(Convert.ToInt32(limit), data.Count - Convert.ToInt32(limit));
     199          }
     200        }
     201        else if (data.Count > Convert.ToInt32(limit))
     202        {
     203          data.RemoveRange(Convert.ToInt32(limit), data.Count - Convert.ToInt32(limit));
     204        }
     205
     206        List<string> id = new List<string>();
    162207        List<double> wait = new List<double>();
    163208        List<double> transfer = new List<double>();
    164209        List<double> run = new List<double>();
     210        data.ForEach(i => id.Add(i.TaskID.ToString()));
    165211        data.ForEach(w => wait.Add(w.TotalWaiting));
    166212        data.ForEach(t => transfer.Add(t.TotalTransfer));
    167213        data.ForEach(r => run.Add(r.TotalRuntime));
    168         overallResult.Add(wait);
    169         overallResult.Add(transfer);
    170         overallResult.Add(run);
    171 
    172         return Json(overallResult,JsonRequestBehavior.AllowGet);
    173       }
     214
     215        List<List<double>> taskStats = new List<List<double>>();
     216        taskStats.Add(wait);
     217        taskStats.Add(transfer);
     218        taskStats.Add(run);
     219
     220        return Json(new KeyValuePair<List<string>, List<List<double>>>(id, taskStats), JsonRequestBehavior.AllowGet);
     221      }
     222    }
     223
     224    private static TaskState GetTaskState(string taskState) {
     225      TaskState state = TaskState.Finished;
     226      switch (taskState)
     227      {
     228        case "Aborted":
     229          state = TaskState.Aborted;
     230          break;
     231        case "Calculating":
     232          state = TaskState.Calculating;
     233          break;
     234        case "Failed":
     235          state = TaskState.Failed;
     236          break;
     237        case "Finished":
     238          state = TaskState.Finished;
     239          break;
     240        case "Offline":
     241          state = TaskState.Offline;
     242          break;
     243        case "Paused":
     244          state = TaskState.Paused;
     245          break;
     246        case "Transferring":
     247          state = TaskState.Transferring;
     248          break;
     249        case "Waiting":
     250          state = TaskState.Waiting;
     251          break;
     252      }
     253      return state;
    174254    }
    175255
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs

    r11020 r11030  
    55using System.Web.Mvc;
    66using HeuristicLab.Services.Hive.Statistics.Models;
     7using HeuristicLab.Services.Hive.DataAccess;
    78
    89namespace HeuristicLab.Services.Hive.Statistics.Controllers {
     
    1415        UserName = User.Identity.Name
    1516      };
     17
     18      //Initialize drop down list values
     19      var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
     20      ViewBag.JobNames = new SelectList(db.DimJobs, "JobId", "JobName");
     21      var TaskStateList = (from task in db.FactTasks
     22                           select task.TaskState).Distinct();
     23      ViewBag.TaskStates = new SelectList(TaskStateList);
     24
    1625      return View(result);
    1726    }
     
    2534      if (User.IsInRole("Hive Administrator")) {
    2635        result.IsAdmin = true;
     36
     37        //Initialize drop down list values
     38        var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
     39        ViewBag.JobNames = new SelectList(db.DimJobs, "JobId", "JobName");
     40        var TaskStateList = (from task in db.FactTasks
     41                             select task.TaskState).Distinct();
     42        ViewBag.TaskStates = new SelectList(TaskStateList);
    2743      }
    2844
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj

    r11020 r11030  
    110110    <Compile Include="Controllers\AdminDataController.cs" />
    111111    <Compile Include="Controllers\ChartDataController.cs" />
     112    <Compile Include="Controllers\ExceptionDataController.cs" />
    112113    <Compile Include="Controllers\HomeController.cs" />
    113114    <Compile Include="Controllers\LoginRequiredController.cs" />
     
    123124    <Content Include="App_Code\ChartHelper.cshtml" />
    124125    <Content Include="App_Code\AdminHelper.cshtml" />
     126    <Content Include="App_Code\ExceptionHelper.cshtml" />
    125127    <None Include="Properties\AssemblyInfo.cs.frame" />
    126128    <Content Include="Scripts\CollapsingSection.js" />
     129    <Content Include="Scripts\jquery.scrollstop.js" />
    127130    <Content Include="Scripts\SmoothieChartResize.js" />
    128131    <Content Include="Views\LoginRequired\UserTask.cshtml" />
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js

    r11020 r11030  
    2626  }
    2727}
     28
     29/* Passed the interior div this fucntion is used to create an automatically collapsed
     30  section */
     31function collapsedByDefault(caller) {
     32  $(caller).parent().children("canvas, div, fieldset, label").css("display","none");
     33}
     34
     35/* Used when scrolling to a task by error, opens the container before task is scrolled to */
     36function openOnError(caller) {
     37  var jqCaller = $(caller);
     38  jqCaller.parent().children("canvas, div, fieldset, label").fadeIn();
     39  jqCaller.parent().children("button").html("-");
     40}
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml

    r11020 r11030  
    2525      <select id="UserList" class="usersList">
    2626      </select>
    27       <label>Start</label>
    28       @Html.TextBox("UserStart", (DateTime.Now - new TimeSpan(8, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
    29       <label>End</label>
    30       @Html.TextBox("UserEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     27      <fieldset id="FilterChoices">
     28        <legend>Filter by</legend>
     29        <label>Date</label>
     30        <input type="checkbox" name="filterChoice" value="Date" checked="checked">
     31        <label>Job Name</label>
     32        <input type="checkbox" name="filterChoice" value="JobName">
     33        <label>Task State</label>
     34        <input type="checkbox" name="filterChoice" value="TaskState">
     35        <label>Limit</label>
     36        <select id="Limit">
     37          <option>20</option>
     38          <option>50</option>
     39          <option selected="selected">100</option>
     40          <option>200</option>
     41        </select>
     42      </fieldset>
    3143    </fieldset>
    32     <section id="TasksContainer" class="adminDataContainer"></section>
     44    <fieldset id="Filters">
     45      <legend>Filters</legend>
     46      <fieldset id="FilterDate" class="filterContainer">
     47        <legend>Date</legend>
     48        <label>Start</label>
     49        @Html.TextBox("UserStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     50        <label>End</label>
     51        @Html.TextBox("UserEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     52      </fieldset>
     53      <fieldset id="FilterJobName" class="filterContainer">
     54        <legend>Job Name</legend>
     55        @Html.DropDownList("JobNames")
     56      </fieldset>
     57      <fieldset id="FilterTaskState" class="filterContainer">
     58        <legend>Task State</legend>
     59        @Html.DropDownList("TaskStates")
     60      </fieldset>
     61      <button id="Apply">Apply</button>
     62    </fieldset>
     63    <button id="ScrollTop">^</button>
     64    <section id="TasksContainer" class="tabDataContainer"></section>
    3365  </section>
    3466  //Task overview
     
    3971      </select>
    4072      <label>Start</label>
    41       @Html.TextBox("TaskStart", (DateTime.Now - new TimeSpan(8, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     73      @Html.TextBox("TaskStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
    4274      <label>End</label>
    4375      @Html.TextBox("TaskEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
    4476    </fieldset>
    45     <section id="TaskStatsContainer" class="adminDataContainer"></section>
     77    <section id="TaskStatsContainer" class="tabDataContainer taskOverview"></section>
    4678  </section>
    4779}
     
    5587  @Scripts.Render("~/bundles/jqueryui")
    5688  @Scripts.Render("~/Scripts/CollapsingSection.js")
     89  @Scripts.Render("~/Scripts/jquery.scrollstop.js")
    5790  @Scripts.Render("~/Scripts/jqPlot/jquery.jqplot")
    5891  @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.barRenderer.min.js")
     
    67100    var endDate;
    68101    var selectedUser;
     102    var limit;
     103    var pageNumber;
    69104
    70105    $(document).ready(function () {
     
    73108        onSelect: function () { RefreshUser(); }
    74109      });
     110      $("#TaskStart, #TaskEnd").datepicker({
     111        dateFormat: "yy-mm-dd",
     112        onSelect: function () { RefreshTask(); }
     113      });
     114    });
     115
     116    $("#Apply").button({
     117      icons: {
     118        primary: "ui-icon-refresh"
     119      }
     120    });
     121
     122    $("#Apply").click(function () {
     123      RefreshUser();
    75124    });
    76125
     
    79128    });
    80129
    81     function RefreshUser () {
     130    $("[name='filterChoice']").click(function () {
     131      var filterName = $(this).val();
     132      if ($(this).is(':checked')) {
     133        $("#Filter" + filterName).css("display", "inline-block");
     134      }
     135      else {
     136        $("#Filter" + filterName).css("display", "none");
     137      }
     138    });
     139
     140    function RefreshUser() {
    82141      selectedUser = $("#UserList").val();
    83       startDate = $('#UserStart').val();
    84       endDate = $('#UserEnd').val();
    85       @ChartHelper.TasksForUser("TasksContainer", "Task", Url.Action("GetUserTask", "ChartData"),"selectedUser","startDate","endDate")
    86       @ChartHelper.ResizeTasks("Task")
     142      limit = $("#Limit").val();
     143      startDate = null;
     144      endDate = null;
     145      jobId = null;
     146      taskState = null;
     147      if ($("[value='Date']").is(":checked")) {
     148        startDate = $('#UserStart').val();
     149        endDate = $('#UserEnd').val();
     150      }
     151      if ($("[value='JobName']").is(':checked')) {
     152        jobId = $('#JobNames').val();
     153      }
     154      if ($("[value='TaskState']").is(':checked')) {
     155        taskState = $('#TaskState').val();
     156      }
     157      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"selectedUser","limit","startDate","endDate","jobId","taskState")
     158      @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("NumberPages", "ChartData"),Url.Action("GetUserTask", "ChartData"),"RefreshUser","selectedUser","limit","startDate","endDate","jobId","taskState","pageNumber")
    87159    }
    88160
    89     $(document).ready(function () {
    90       $("#TaskStart, #TaskEnd").datepicker({
    91         dateFormat: "yy-mm-dd",
    92         onSelect: function () { RefreshTask(); }
    93       });
    94     });
     161    @ChartHelper.ResizeTasks("Task")
     162    @ExceptionHelper.ScrollToException()
    95163
    96164    $("#TaskUserList").change(function () {
     
    102170      startDate = $('#TaskStart').val();
    103171      endDate = $('#TaskEnd').val();
    104       @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("AllTaskStats", "AdminData"),Url.Action("UserTaskStats", "AdminData"),"selectedUser","startDate","endDate")
     172      @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("TaskStats", "AdminData"),"selectedUser","startDate","endDate")
    105173    }
    106174
  • branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml

    r11020 r11030  
    66
    77<h1>Task Information for User: @Model.UserName</h1>
    8 <section>
    9   <fieldset id="filters">
     8<button id="TaskInformationButton" class="tabButton">Task Information</button>
     9<button id="TaskOverviewButton" class="tabButton">Task Overview</button>
     10<section id="TaskInformationTab" class="tabSection">
     11  <fieldset id="FilterChoices">
     12    <legend>Filter by</legend>
     13    <label>Date</label>
     14    <input type="checkbox" name="filterChoice" value="Date" checked="checked">
     15    <label>Job Name</label>
     16    <input type="checkbox" name="filterChoice" value="JobName">
     17    <label>Task State</label>
     18    <input type="checkbox" name="filterChoice" value="TaskState">
     19    <label>Limit</label>
     20    <select id="Limit">
     21      <option>10</option>
     22      <option>50</option>
     23      <option selected="selected">100</option>
     24      <option>200</option>
     25    </select>
     26  </fieldset>
     27  <fieldset id="Filters">
    1028    <legend>Filters</legend>
    11     <label>Start</label>
    12     @Html.TextBox("Start", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
    13     <label>End</label>
    14     @Html.TextBox("End", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     29    <fieldset id="FilterDate" class="filterContainer">
     30      <legend>Date</legend>
     31      <label>Start</label>
     32      @Html.TextBox("InfoStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     33      <label>End</label>
     34      @Html.TextBox("InfoEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     35    </fieldset>
     36    <fieldset id="FilterJobName" class="filterContainer">
     37      <legend>Job Name</legend>
     38      @Html.DropDownList("JobNames")
     39    </fieldset>
     40    <fieldset id="FilterTaskState" class="filterContainer">
     41      <legend>Task State</legend>
     42      @Html.DropDownList("TaskStates")
     43    </fieldset>
    1544    <button id="Apply">Apply</button>
    1645  </fieldset>
     46  <button id="ScrollTop">^</button>
     47  <section id="TasksContainer" class="tabDataContainer"></section>
    1748</section>
    18 <section id="TasksContainer">
     49<section id="TaskOverviewTab" class="tabSection">
     50  <fieldset id="TaskOverviewFilter" class="usersField">
     51    <legend>Filters</legend>
     52    <label id="TaskOverviewFilterFirst">Start</label>
     53    @Html.TextBox("OverviewStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     54    <label>End</label>
     55    @Html.TextBox("OverviewEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     56  </fieldset>
     57  <section id="TaskStatsContainer" class="tabDataContainer taskOverview"></section>
    1958</section>
    2059
     
    2766  @Scripts.Render("~/bundles/jqueryui")
    2867  @Scripts.Render("~/Scripts/CollapsingSection.js")
     68  @Scripts.Render("~/Scripts/jquery.scrollstop.js")
    2969  @Scripts.Render("~/Scripts/jqPlot/jquery.jqplot")
    3070  @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.barRenderer.min.js")
     
    4080      }
    4181    });
     82    $("#Apply").click(function () {
     83      TaskInformation();
     84    });
     85
    4286    $(document).ready(function () {
    43       $(".date").datepicker({
     87      $("#InfoStart, #InfoEnd").datepicker({
    4488        dateFormat: "yy-mm-dd",
    45         onSelect: function () { filterTasks(); }
     89        onSelect: function () { TaskInformation(); }
     90      });
     91      $("#OverviewStart, #OverviewEnd").datepicker({
     92        dateFormat: "yy-mm-dd",
     93        onSelect: function () { TaskOverview(); }
    4694      });
    4795    });
    48     $("#Apply").click(function () {
    49       filterTasks();
     96
     97    $("[name='filterChoice']").click(function () {
     98      var filterName = $(this).val();
     99      if ($(this).is(':checked')) {
     100        $("#Filter" + filterName).css("display", "inline-block");
     101      }
     102      else {
     103        $("#Filter" + filterName).css("display", "none");
     104      }
    50105    });
    51106
    52     function filterTasks() {
    53       startDate = $('#Start').val();
    54       endDate = $('#End').val();
     107    var userName = "@Model.UserName";
     108    var limit = $('#Limit').val();
     109    var startDate = $('#InfoStart').val();
     110    var endDate = $('#InfoEnd').val();
     111    var jobId;
     112    var taskState;
     113    var pageNumber;
    55114
    56       @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("GetUserTask", "ChartData"),"userName","startDate","endDate")
    57       @ChartHelper.ResizeTasks("Task")
     115    function TaskInformation() {
     116      limit = $('#Limit').val();
     117      startDate = null;
     118      endDate = null;
     119      jobId = null;
     120      taskState = null;
     121      if ($("[value='Date']").is(":checked")) {
     122        startDate = $('#InfoStart').val();
     123        endDate = $('#InfoEnd').val();
     124      }
     125      if ($("[value='JobName']").is(':checked')) {
     126        jobId = $('#JobNames').val();
     127      }
     128      if ($("[value='TaskState']").is(':checked')) {
     129        taskState = $('#TaskState').val();
     130      }
     131      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"userName","limit","startDate","endDate","jobId","taskState")
     132      @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("NumberPages", "ChartData"),Url.Action("GetUserTask", "ChartData"),"TaskInformation","userName","limit","startDate","endDate","jobId","taskState","pageNumber")
     133      pageNumber = null;
    58134    }
    59135
    60     var userName = "@Model.UserName";
    61     var startDate = $('#Start').val();
    62     var endDate = $('#End').val();
     136    function TaskOverview() {
     137      startDate = $('#OverviewStart').val();
     138      endDate = $('#OverviewEnd').val();
     139      @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("TaskStats", "AdminData"),"userName","startDate","endDate")
     140    }
    63141
    64     @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("GetUserTask", "ChartData"),"userName","startDate","endDate")
     142    $(".tabButton").click(function () {
     143      var sender = $(this).attr('id');
     144      $(".tabButton").css({ 'border-bottom': '1px solid #8297F5', 'background': 'none' });
     145      $(this).css({ 'border-bottom': '1px solid #E0E6FF', 'background-color': '#E0E6FF' });
     146      $(".tabSection").css('display', 'none');
     147      $("#" + sender.slice(0, -6) + "Tab").css('display', 'block');
     148    })
     149
     150    TaskInformation();
    65151    @ChartHelper.ResizeTasks("Task")
     152    @ExceptionHelper.ScrollToException()
    66153  </script>
    67 
    68154}
Note: See TracChangeset for help on using the changeset viewer.