This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new 9b8809fea5 add table sort function for table size (#9844) 9b8809fea5 is described below commit 9b8809fea50e3d516a4f4bde8d0c6341f30ce158 Author: Johan Adami <4760722+jadam...@users.noreply.github.com> AuthorDate: Fri Dec 2 13:50:31 2022 -0500 add table sort function for table size (#9844) --- .../src/main/resources/app/components/Table.tsx | 21 ++++++---- .../src/main/resources/app/interfaces/types.d.ts | 2 + .../src/main/resources/app/utils/SortFunctions.tsx | 49 ++++++++++++++++++++++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/pinot-controller/src/main/resources/app/components/Table.tsx b/pinot-controller/src/main/resources/app/components/Table.tsx index d7cfb2e669..b5871d788e 100644 --- a/pinot-controller/src/main/resources/app/components/Table.tsx +++ b/pinot-controller/src/main/resources/app/components/Table.tsx @@ -35,7 +35,7 @@ import TableContainer from '@material-ui/core/TableContainer'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import { TablePagination, Tooltip } from '@material-ui/core'; -import { TableData } from 'Models'; +import {TableData, TableSortFunction} from 'Models'; import IconButton from '@material-ui/core/IconButton'; import FirstPageIcon from '@material-ui/icons/FirstPage'; import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft'; @@ -47,6 +47,7 @@ import { Link } from 'react-router-dom'; import Chip from '@material-ui/core/Chip'; import { get, has, orderBy } from 'lodash'; import app_state from '../app_state'; +import { sortBytes, sortNumberOfSegments } from '../utils/SortFunctions' import Utils from '../utils/Utils'; import TableToolbar from './TableToolbar'; import SimpleAccordion from './SimpleAccordion'; @@ -73,6 +74,15 @@ type Props = { tooltipData?: string[] }; +// These sort functions are applied to any columns with these names. Otherwise, we just +// sort on the raw data. Ideally users of this class would pass in custom sort functions +// for their columns, but this pattern already existed, so we're at least making the +// improvement to pull this out to a common variable. +let staticSortFunctions: Map<string, TableSortFunction> = new Map() +staticSortFunctions.set("Number of Segments", sortNumberOfSegments); +staticSortFunctions.set("Estimated Size", sortBytes); +staticSortFunctions.set("Reported Size", sortBytes); + const StyledTableRow = withStyles((theme) => createStyles({ root: { @@ -464,13 +474,8 @@ export default function CustomizedTables({ className={classes.head} key={index} onClick={() => { - if(column === 'Number of Segments'){ - const data = finalData.sort((a,b)=>{ - const aSegmentInt = parseInt(a[column+app_state.columnNameSeparator+index]); - const bSegmentInt = parseInt(b[column+app_state.columnNameSeparator+index]); - const result = order ? (aSegmentInt > bSegmentInt) : (aSegmentInt < bSegmentInt); - return result ? 1 : -1; - }); + if (staticSortFunctions.has(column)) { + finalData.sort((a, b) => staticSortFunctions.get(column)(a, b, column, index, order)); setFinalData(finalData); } else { setFinalData(orderBy(finalData, column+app_state.columnNameSeparator+index, order ? 'asc' : 'desc')); diff --git a/pinot-controller/src/main/resources/app/interfaces/types.d.ts b/pinot-controller/src/main/resources/app/interfaces/types.d.ts index 29d9927e13..79b28d7e16 100644 --- a/pinot-controller/src/main/resources/app/interfaces/types.d.ts +++ b/pinot-controller/src/main/resources/app/interfaces/types.d.ts @@ -223,6 +223,8 @@ declare module 'Models' { } } + export type TableSortFunction = (a: any, b: any, column: string, index: number, order: boolean) => number; + export const enum SEGMENT_STATUS { ONLINE = "ONLINE", OFFLINE = "OFFLINE", diff --git a/pinot-controller/src/main/resources/app/utils/SortFunctions.tsx b/pinot-controller/src/main/resources/app/utils/SortFunctions.tsx new file mode 100644 index 0000000000..a9943533c1 --- /dev/null +++ b/pinot-controller/src/main/resources/app/utils/SortFunctions.tsx @@ -0,0 +1,49 @@ +/** + * 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. + */ + +import {TableSortFunction} from "Models"; +import app_state from "../app_state"; + + +// table sorting requires a 1/-1 result. This helper function helps calculate this +// from any two results. +const valuesToResultNumber = (aRes: any, bRes: any, order: boolean): number => { + const result = order ? aRes > bRes : aRes < bRes; + return result ? 1 : -1; +} + +export const sortNumberOfSegments: TableSortFunction = (a: any, b: any, column: string, index: number, order: boolean) => { + const aSegmentInt = parseInt(a[column+app_state.columnNameSeparator+index]); + const bSegmentInt = parseInt(b[column+app_state.columnNameSeparator+index]); + return valuesToResultNumber(aSegmentInt, bSegmentInt, order); +} + +export const sortBytes: TableSortFunction = (a: any, b: any, column: string, index: number, order: boolean) => { + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const [aValue, aUnit] = a[column+app_state.columnNameSeparator+index].split(" "); + const [bValue, bUnit] = b[column+app_state.columnNameSeparator+index].split(" "); + const aUnitIndex = sizes.indexOf(aUnit); + const bUnitIndex = sizes.indexOf(bUnit); + + if (sizes.indexOf(aUnit) === sizes.indexOf(bUnit)) { + return valuesToResultNumber(parseFloat(aValue), parseFloat(bValue), order); + } else { + return valuesToResultNumber(aUnitIndex, bUnitIndex, order); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org