<!--
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 }}

<h2>Catalog</h2>

{{?has_large_tables}}
<div class="card">
  <div class="card-header">
      <h5 class="card-title">
      Top-{{num_large_tables}} Tables with Highest Memory Requirements
      </h5>
  </div>
  <div class="card-body">
    <table id="large-tables" class='table table-hover table-bordered'>
      <thead>
        <tr>
          <th>Name</th>
          <th>Estimated memory</th>
          <th>Metrics</th>
        </tr>
      </thead>
      <tbody>
        {{#large_tables}}
        <tr>
          <td>
          <!-- The /catalog_object endpoint is disabled if local_catalog_mode is used
            since metadata is partially fetched on demand. -->
          {{?use_local_catalog}} {{name}} {{/use_local_catalog}}
          {{^use_local_catalog}}
           <a href="{{ __common__.host-url }}/catalog_object?object_type=TABLE&object_name={{name}}">{{name}}</a>
          {{/use_local_catalog}}
          </td>
          <td>{{mem_estimate}}</td>
          <td><a href="{{ __common__.host-url }}/table_metrics?name={{name}}">{{name}}-metrics</a></td>
        </tr>
        {{/large_tables}}
      </tbody>
    </table>
  </div>
</div>

<script>
    $(document).ready(function() {
        $('#large-tables').DataTable({
            "columnDefs": [{"targets": 1, "render": renderSize}],
            "order": [[ 1, "desc" ]],
            "pageLength": 10
        });
    });
</script>
{{/has_large_tables}}

{{?has_frequent_tables}}
<div class="card">
  <div class="card-header">
      <h5 class="card-title">
      Top-{{num_frequent_tables}} Tables with Highest Number of Metadata Operations
      </h5>
  </div>
  <div class="card-body">
    <table id="frequent-tables" class='table table-hover table-bordered'>
      <thead>
        <tr>
          <th>Name</th>
          <th>Metadata Operations (since loaded)</th>
          <th>Metrics</th>
        </tr>
      </thead>
      <tbody>
        {{#frequent_tables}}
        <tr>
          <td>
          {{?use_local_catalog}} {{name}} {{/use_local_catalog}}
          {{^use_local_catalog}}
           <a href="{{ __common__.host-url }}/catalog_object?object_type=TABLE&object_name={{name}}">{{name}}</a>
          {{/use_local_catalog}}
          </td>
          <td>{{num_metadata_ops}}</td>
          <td><a href="{{ __common__.host-url }}/table_metrics?name={{name}}">{{name}}-metrics</a></td>
        </tr>
        {{/frequent_tables}}
      </tbody>
    </table>
  </div>
</div>

<script>
    $(document).ready(function() {
        $('#frequent-tables').DataTable({
            "order": [[ 0, "desc" ]],
            "pageLength": 10
        });
    });
</script>
{{/has_frequent_tables}}

{{?has_high_file_count_tables}}
<div class="card">
  <div class="card-header">
      <h5 class="card-title">
      Top-{{num_high_file_count_tables}} Tables with Most Number of Files
      </h5>
  </div>
  <div class="card-body">
    <table id="high-file-count-tables" class='table table-hover table-bordered'>
      <thead>
        <tr>
          <th>Name</th>
          <th>Number of Files</th>
          <th>Metrics</th>
        </tr>
      </thead>
      <tbody>
        {{#high_file_count_tables}}
        <tr>
          <td>
          {{?use_local_catalog}} {{name}} {{/use_local_catalog}}
          {{^use_local_catalog}}
           <a href="{{ __common__.host-url }}/catalog_object?object_type=TABLE&object_name={{name}}">{{name}}</a>
          {{/use_local_catalog}}
          </td>
          <td>{{num_files}}</td>
          <td><a href="{{ __common__.host-url }}/table_metrics?name={{name}}">{{name}}-metrics</a></td>
        </tr>
        {{/high_file_count_tables}}
      </tbody>
    </table>
  </div>
</div>

<script>
    $(document).ready(function() {
        $('#high-file-count-tables').DataTable({
            "order": [[ 1, "desc" ]],
            "pageLength": 10
        });
    });
</script>
{{/has_high_file_count_tables}}

{{?has_longest_loading_tables}}
<div class="card">
  <div class="card-header">
      <h5 class="card-title">
      Top-{{num_longest_loading_tables}} Tables with Longest Metadata Loading Time
      </h5>
  </div>
  <div class="card-body">
    <table id="long-metadata-loading-tables" class='table table-hover table-bordered'>
      <thead>
        <tr>
          <th>Name</th>
          <th>Median Loading Time</th>
          <th>Maximum Loading Time</th>
          <th>75th %-ile Loading Time</th>
          <th>95th %-ile Loading Time</th>
          <th>99th %-ile Loading Time</th>
          <th>Table Loading Counts</th>
          <th>Metrics</th>
        </tr>
      </thead>
      <tbody>
        {{#longest_loading_tables}}
        <tr>
          <td>
          {{?use_local_catalog}} {{name}} {{/use_local_catalog}}
          {{^use_local_catalog}}
           <a href="{{ __common__.host-url }}/catalog_object?object_type=TABLE&object_name={{name}}">{{name}}</a>
          {{/use_local_catalog}}
          </td>
          <td>{{median_metadata_loading_time_ns}}</td>
          <td>{{max_metadata_loading_time_ns}}</td>
          <td>{{p75_loading_time_ns}}</td>
          <td>{{p95_loading_time_ns}}</td>
          <td>{{p99_loading_time_ns}}</td>
          <td>{{table_loading_count}}</td>
          <td><a href="{{ __common__.host-url }}/table_metrics?name={{name}}">{{name}}-metrics</a></td>
        </tr>
        {{/longest_loading_tables}}
      </tbody>
    </table>
  </div>
</div>

<script>
    $(document).ready(function() {
        $('#long-metadata-loading-tables').DataTable({
            "order": [[ 2, "desc" ]],
            "pageLength": 10,
            "columnDefs": [{"targets": 1, "render": renderTime},
                           {"targets": 2, "render": renderTime},
                           {"targets": 3, "render": renderTime},
                           {"targets": 4, "render": renderTime},
                           {"targets": 5, "render": renderTime}],
        });
    });
</script>
{{/has_longest_loading_tables}}

<h3>Databases</h3>
<ol class="breadcrumb">
{{#databases}}
<li class="breadcrumb-item"><a href='#{{name}}'>{{name}}</a></li>
{{/databases}}
</ol>

{{#databases}}

<div class="card">
  <div class="card-header">
  {{^use_local_catalog}}
    <a href='{{ __common__.host-url }}/catalog_object?object_type=DATABASE&object_name={{name}}'>
  {{/use_local_catalog}}
      <h5 class="card-title" id='{{name}}'>{{name}}
      <span class="float-right">{{num_tables}} table(s)</span></h5>
  {{^use_local_catalog}}
    </a>
  {{/use_local_catalog}}
  </div>
  <div class="card-body">
    <table id="{{name}}-tables" class='table table-hover table-bordered'>
      <thead>
        <tr>
          <th>Name</th>
          {{?has_metrics}}
          <th>Metrics</th>
          {{/has_metrics}}
        </tr>
      </thead>
      <tbody>
        {{#tables}}
        <tr>
          <td>
          {{?use_local_catalog}} {{name}} {{/use_local_catalog}}
          {{^use_local_catalog}}
           <a href="{{ __common__.host-url }}/catalog_object?object_type=TABLE&object_name={{fqtn}}">{{name}}</a>
          {{/use_local_catalog}}
          </td>
          {{?has_metrics}}
          <td><a href="{{ __common__.host-url }}/table_metrics?name={{fqtn}}">{{name}}-metrics</a></td>
          {{/has_metrics}}
        </tr>
        {{/tables}}
      </tbody>
    </table>
  </div>
</div>

<script>
    $(document).ready(function() {
        $('#{{name}}-tables').DataTable({
            "pageLength": 5
        });
    });
</script>

{{/databases}}

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