| /* |
| 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. |
| */ |
| |
| |
| var get_tooltip = function( segment_response ) { |
| var tooltip = |
| '<div>Segment <b>' + segment_response.name + '</b>:</div>' + |
| '<div class="label">#docs:</div><div>' + number_format(segment_response.size) +'</div>' + |
| '<div class="label">#dels:</div><div>' + number_format(segment_response.delCount) + '</div>' + |
| '<div class="label">size:</div><div>' + number_format(segment_response.sizeInBytes) + ' bytes </div>' + |
| '<div class="label">age:</div><div>' + segment_response.age + '</div>' + |
| '<div class="label">source:</div><div>' + segment_response.source + '</div>'; |
| return tooltip; |
| }; |
| |
| var get_entry = function( segment_response, segment_bytes_max ) { |
| //calcualte dimensions of graph |
| var dims = calculate_dimensions(segment_response.sizeInBytes, |
| segment_bytes_max, segment_response.size, segment_response.delCount) |
| //create entry for segment with given dimensions |
| var entry = get_entry_item(segment_response.name, dims, |
| get_tooltip(segment_response), (segment_response.mergeCandidate)?true:false); |
| |
| return entry; |
| }; |
| |
| var get_entry_item = function(name, dims, tooltip, isMergeCandidate) { |
| var entry = '<li>' + "\n" + |
| ' <dl class="clearfix" style="width: ' + dims['size'] + '%;">' + "\n" + |
| ' <dt><div>' + name + '</div></dt>' + "\n" + |
| ' <dd>'; |
| entry += '<div class="live' + ((isMergeCandidate)?' merge-candidate':'') + |
| '" style="width: ' + dims['alive_doc_size'] + '%;"> </div>'; |
| entry += '<div class="toolitp">' + tooltip +'</div>'; |
| |
| if (dims['deleted_doc_size'] > 0.001) { |
| entry += '<div class="deleted" style="width:' + dims['deleted_doc_size'] |
| + '%;margin-left:' + dims['alive_doc_size'] + '%;"> </div>'; |
| } |
| entry += '</dd></dl></li>'; |
| return entry; |
| }; |
| |
| var get_footer = function(deletions_count, documents_count) { |
| return '<li><dl><dt></dt><dd>Deletions: ' + |
| (documents_count == 0 ? 0 : round_2(deletions_count/documents_count * 100)) + |
| '% </dd></dl></li>'; |
| }; |
| |
| var calculate_dimensions = function(segment_size_in_bytes, segment_size_in_bytes_max, doc_count, delete_doc_count) { |
| var segment_size_in_bytes_log = Math.log(segment_size_in_bytes); |
| var segment_size_in_bytes_max_log = Math.log(segment_size_in_bytes_max); |
| |
| var dims = {}; |
| //Normalize to 100% size of bar |
| dims['size'] = Math.floor((segment_size_in_bytes_log / segment_size_in_bytes_max_log ) * 100); |
| //Deleted doc part size |
| dims['deleted_doc_size'] = Math.floor((delete_doc_count/(delete_doc_count + doc_count)) * dims['size']); |
| //Alive doc part size |
| dims['alive_doc_size'] = dims['size'] - dims['deleted_doc_size']; |
| |
| return dims; |
| }; |
| |
| var calculate_max_size_on_disk = function(segment_entries) { |
| var max = 0; |
| $.each(segment_entries, function(idx, obj) { |
| if (obj.sizeInBytes > max) { |
| max = obj.sizeInBytes; |
| } |
| }); |
| return max; |
| }; |
| |
| var round_2 = function(num) { |
| return Math.round(num*100)/100; |
| }; |
| |
| var number_format = function(x) { |
| return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); |
| }; |
| |
| var prepare_x_axis = function(segment_bytes_max) { |
| var factor = 1024*1024; //for MB |
| |
| var segment_bytes_max_log = Math.log(segment_bytes_max); |
| |
| var series_entry = '<li>' + "\n" + |
| ' <dl class="clearfix" style="width:100%;">' + "\n" + |
| ' <dt><div>Size</div></dt>' + "\n" + |
| ' <dd>' + |
| ' <div class="start">0</div>'; |
| var step = 0; |
| for (var j = 0; j < 3; j+=1) { |
| step += segment_bytes_max_log/4; |
| var step_value = number_format(Math.floor((Math.pow(Math.E, step))/factor)) |
| series_entry += '<div class="w5">' + ((step_value > 0.001)?step_value : ' ') + '</div>' |
| } |
| series_entry += '<div class="end">' + number_format(Math.floor(segment_bytes_max/factor)) + ' MB </div>' + |
| ' </dd>' + |
| ' </dl>' + |
| '</li>'; |
| return series_entry; |
| }; |
| |
| // #/:core/admin/segments |
| sammy.get |
| ( |
| new RegExp( app.core_regex_base + '\\/(segments)$' ), |
| function( context ) |
| { |
| var core_basepath = this.active_core.attr( 'data-basepath' ); |
| var content_element = $( '#content' ); |
| |
| $.get |
| ( |
| 'tpl/segments.html', |
| function( template ) |
| { |
| content_element.html( template ); |
| |
| var segments_element = $('#segments', content_element); |
| var segments_reload = $( '#segments a.reload' ); |
| var url_element = $('#url', segments_element); |
| var result_element = $('#result', segments_element); |
| var response_element = $('#response', result_element); |
| var segments_holder_element = $('.segments-holder', result_element); |
| |
| segments_reload |
| .die( 'click' ) |
| .live |
| ( |
| 'click', |
| function( event ) |
| { |
| $.ajax |
| ( |
| { |
| url : core_basepath + '/admin/segments?wt=json', |
| dataType : 'json', |
| context: this, |
| beforeSend : function( arr, form, options ) |
| { |
| loader.show( this ); |
| }, |
| success : function( response, text_status, xhr ) |
| { |
| var segments_response = response['segments'], |
| segments_entries = [], |
| segment_bytes_max = calculate_max_size_on_disk( segments_response ); |
| |
| //scale |
| segments_entries.push( prepare_x_axis( segment_bytes_max ) ); |
| |
| var documents_count = 0, deletions_count = 0; |
| |
| //elements |
| $.each( segments_response, function( key, segment_response ) { |
| segments_entries.push( get_entry( segment_response, segment_bytes_max ) ); |
| |
| documents_count += segment_response.size; |
| deletions_count += segment_response.delCount; |
| }); |
| |
| //footer |
| segments_entries.push( get_footer( deletions_count, documents_count ) ); |
| |
| $( 'ul', segments_holder_element ).html( segments_entries.join("\n" ) ); |
| }, |
| error : function( xhr, text_status, error_thrown ) |
| { |
| $( this ) |
| .attr( 'title', '/admin/segments is not configured (' + xhr.status + ': ' + error_thrown + ')' ); |
| |
| $( this ).parents( 'li' ) |
| .addClass( 'error' ); |
| }, |
| complete : function( xhr, text_status ) |
| { |
| loader.hide( this ); |
| } |
| } |
| ); |
| return false; |
| } |
| ); |
| //initially submit |
| segments_reload.click(); |
| } |
| ); |
| } |
| ); |