import React, { useMemo } from 'react'; import numeral from 'numeral'; import { css, Tooltip, spacing } from '@mongodb-js/compass-components'; import type { CollectionState } from '../../modules/collection-tab'; import CollectionStatsItem from '../collection-stats-item'; const collectionStatsStyles = css({ textAlign: 'right', paddingRight: 0, display: 'flex', float: 'right', }); const collectionStatsBodyStyles = css({ display: 'flex', flexDirection: 'row', marginRight: spacing[3], }); const tooltipDocumentsListStyles = css({ listStyleType: 'none', padding: 0, margin: 0, }); const tooltipIndexeListStyles = css({ listStyleType: 'none', padding: 0, margin: 0, marginTop: spacing[3], }); type CollectionStatsProps = { stats: CollectionState['stats']; isTimeSeries?: boolean; }; const INVALID = 'N/A'; const avg = (size: number, count: number) => { if (count <= 0) { return 0; } return size / count; }; const isNumber = (val: any): val is number => { return typeof val === 'number' && !isNaN(val); }; const format = (value: any, format = 'a') => { if (!isNumber(value)) { return INVALID; } const precision = value <= 1000 ? '0' : '0.0'; return numeral(value).format(precision + format); }; const CollectionStats: React.FunctionComponent = ({ isTimeSeries, stats, }: CollectionStatsProps) => { const { documentCount, storageSize, avgDocumentSize, indexCount, totalIndexSize, avgIndexSize, } = useMemo(() => { const { document_count = NaN, storage_size = NaN, free_storage_size = NaN, avg_document_size = NaN, index_count = NaN, index_size = NaN, } = stats ?? {}; return { documentCount: format(document_count), storageSize: format(storage_size - free_storage_size, 'b'), avgDocumentSize: format(avg_document_size, 'b'), indexCount: format(index_count), totalIndexSize: format(index_size, 'b'), avgIndexSize: format(avg(index_size, index_count), 'b'), }; }, [stats]); return (
(
{!isTimeSeries && ( )} {!isTimeSeries && ( )}
{children}
)} >
  1. Documents: {documentCount}
  2. Storage Size: {storageSize}
  3. Avg. Size: {avgDocumentSize}
  1. Indexes: {indexCount}
  2. Total Size: {totalIndexSize}
  3. Avg. Size: {avgIndexSize}
); }; export default CollectionStats;