<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

{{> www/common-header.tmpl }}
{{> www/query_detail_tabs.tmpl }}
<br/>
{{?backend_states}}
<div>
  <label>
    <input type="checkbox" checked="true" id="toggle" onClick="toggleRefresh()"/>
    <span id="refresh_on">Auto-refresh on</span>
  </label>  Last updated: <span id="last-updated"></span>
</div>

<br/>
<table id="backends" class='table table-hover table-bordered'>
  <thead>
    <tr>
      <th>Host</th>
      <th>Num. instances</th>
      <th>Num. remaining instances</th>
      <th>Done</th>
      <th>Peak per-host mem. consumption</th>
      <th>Scan bytes read</th>
      <th>User CPU(s)</th>
      <th>Kernel CPU(s)</th>
      <th>Time since last report (ms)</th>
    </tr>
  </thead>
  <tbody>

  </tbody>
</table>

<script>
var intervalId = 0;
var table = null;
var refresh = function () {
    table.ajax.reload();
    document.getElementById("last-updated").textContent = new Date();
};

$(document).ready(function() {
    table = $('#backends').DataTable({
        ajax: { url: make_url("/query_backends?query_id={{query_id}}&json"),
                dataSrc: "backend_states",
              },
        "columns": [ {data: 'host'},
                     {data: 'num_instances'},
                     {data: 'num_remaining_instances'},
                     {data: 'done'},
                     {data: 'peak_per_host_mem_consumption', render: renderSize},
                     {data: 'bytes_read', render: renderSize},
                     {data: 'cpu_user_s'},
                     {data: 'cpu_sys_s'},
                     {data: 'time_since_last_heard_from'}],
        "order": [[ 0, "desc" ]],
        "pageLength": 100
    });
    intervalId = setInterval( refresh, 1000 );
});

function toggleRefresh() {
    if (document.getElementById("toggle").checked == true) {
        intervalId = setInterval(refresh, 1000);
        document.getElementById("refresh_on").textContent = "Auto-refresh on";
    } else {
        clearInterval(intervalId);
        document.getElementById("refresh_on").textContent = "Auto-refresh off";
    }
}

</script>
{{/backend_states}}

{{^backend_states}}
<div class="alert alert-info" role="alert">
Query <strong>{{query_id}}</strong> has either completed or has no backends or has not
started any backends yet.
</div>
{{/backend_states}}

<script>
$("#backends-tab").addClass("active");
</script>

{{> www/common-footer.tmpl }}
