app/addons/documents/mango/components/ExecutionStatsPanel.js (76 lines of code) (raw):

// Licensed 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. import React from 'react'; import PropTypes from 'prop-types'; export default class ExecutionStatsPanel extends React.Component { constructor (props) { super(props); } humanizeDuration(milliseconds) { if (milliseconds < 1000) { return Math.round(milliseconds) + ' ms'; } let seconds = milliseconds / 1000; if (seconds < 60) { return Math.floor(seconds) + ' seconds'; } const minutes = Math.floor(seconds / 60); seconds = Math.floor(seconds - (minutes * 60)); const minuteText = minutes > 1 ? 'minutes' : 'minute'; const secondsText = seconds > 1 ? 'seconds' : 'second'; return [minutes, ' ', minuteText, ', ', seconds, ' ', secondsText].join(''); } getWarning(warnings) { if (warnings) { const lines = warnings.split('\n').map((warnText, i) => { return <React.Fragment key={i}>{warnText}<br/></React.Fragment>; }); return <span>{lines}</span>; } } warningPopupComponent(warningText) { if (warningText) { return (<div className="warning"> <i className="fonticon-attention-circled"></i> {warningText} </div>); } } executionStatsLine(title, value, alwaysShow = false, units = "") { const hasValue = value === 0 && !alwaysShow ? "false" : "true"; return <div data-status={hasValue}>{title + ": "}<span className="value">{value.toLocaleString()} {units}</span></div>; } executionStatsBody(executionStats) { let content = null; if (!executionStats) { content = ( <div className='execution-stats-empty-body'> Run query to display execution statistics. </div>); } else { content = ( <div className="execution-stats-body"> {this.executionStatsLine("Executed at", new Date(executionStats.ts).toLocaleTimeString(), true)} {this.executionStatsLine("Execution time", this.humanizeDuration(executionStats.execution_time_ms), true)} {this.executionStatsLine("Results returned", executionStats.results_returned, true)} {this.executionStatsLine("Keys examined", executionStats.total_keys_examined)} {this.executionStatsLine("Documents examined", executionStats.total_docs_examined)} {this.executionStatsLine("Documents examined (quorum)", executionStats.total_quorum_docs_examined)} </div>); } return (<> <div className="execution-stats-header">Execution Statistics</div> {content} </>); } render() { const { executionStatsSupported, executionStats, warning } = this.props; const warningText = this.getWarning(warning); return ( <> <div className="execution-stats"> {this.warningPopupComponent(warningText)} {executionStatsSupported ? this.executionStatsBody(executionStats) : null} </div> </> ); } } ExecutionStatsPanel.propTypes = { executionStats: PropTypes.object, warning: PropTypes.string, executionStatsSupported: PropTypes.bool };