From ba1d51baf20d5426746243ed0022848747dc44f8 Mon Sep 17 00:00:00 2001 From: Mike Bender Date: Fri, 15 Dec 2023 12:15:03 -0500 Subject: [PATCH] feat: "Group" column for rollup/tree tables (#1636) - Have a virtual column that just shows the rolled up value - Displays the value from the "source" cell (ie. the value from the grouping column at that depth) - The context menu shows the filter options for the source cell, so you can filter by options - Virtual column you cannot use quick filters or sort on - Closes #1555 - Tested with rollup from docs: ```py from deephaven import read_csv, agg insurance = read_csv("https://media.githubusercontent.com/media/deephaven/examples/main/Insurance/csv/insurance.csv") agg_list = [agg.avg(cols=["bmi", "expenses"])] by_list = ["region", "age"] test_rollup = insurance.rollup(aggs=[], by=by_list, include_constituents=True) insurance_rollup = insurance.rollup(aggs=agg_list, by=by_list, include_constituents=True) ``` --- packages/grid/src/GridRange.ts | 14 +- packages/iris-grid/src/ColumnStatistics.tsx | 17 +- packages/iris-grid/src/CrossColumnSearch.tsx | 39 +++-- packages/iris-grid/src/IrisGrid.tsx | 43 +++-- packages/iris-grid/src/IrisGridModel.ts | 77 +++++++-- packages/iris-grid/src/IrisGridProxyModel.ts | 6 + .../src/IrisGridTableModelTemplate.ts | 80 +++++---- .../iris-grid/src/IrisGridTreeTableModel.ts | 154 ++++++++++++++++-- .../IrisGridColumnSelectMouseHandler.ts | 5 +- .../IrisGridContextMenuHandler.tsx | 107 ++++++------ .../sidebar/aggregations/AggregationEdit.tsx | 4 +- .../sidebar/aggregations/AggregationUtils.ts | 11 +- .../VisibilityOrderingBuilder.tsx | 24 ++- ...nd-aggregrate-columns-1-chromium-linux.png | Bin 37311 -> 37881 bytes ...and-aggregrate-columns-1-firefox-linux.png | Bin 61509 -> 61793 bytes ...-and-aggregrate-columns-1-webkit-linux.png | Bin 35982 -> 36510 bytes ...nd-aggregrate-columns-2-chromium-linux.png | Bin 35579 -> 35866 bytes ...and-aggregrate-columns-2-firefox-linux.png | Bin 60488 -> 60684 bytes ...-and-aggregrate-columns-2-webkit-linux.png | Bin 34593 -> 35033 bytes ...nd-aggregrate-columns-3-chromium-linux.png | Bin 13535 -> 13930 bytes ...and-aggregrate-columns-3-firefox-linux.png | Bin 20831 -> 21842 bytes ...-and-aggregrate-columns-3-webkit-linux.png | Bin 12315 -> 12828 bytes ...nd-aggregrate-columns-4-chromium-linux.png | Bin 15040 -> 15390 bytes ...and-aggregrate-columns-4-firefox-linux.png | Bin 22634 -> 23216 bytes ...-and-aggregrate-columns-4-webkit-linux.png | Bin 13839 -> 14468 bytes ...nd-aggregrate-columns-5-chromium-linux.png | Bin 43433 -> 44354 bytes ...and-aggregrate-columns-5-firefox-linux.png | Bin 70780 -> 71337 bytes ...-and-aggregrate-columns-5-webkit-linux.png | Bin 40720 -> 41444 bytes ...nd-aggregrate-columns-6-chromium-linux.png | Bin 43680 -> 41697 bytes ...and-aggregrate-columns-6-firefox-linux.png | Bin 70984 -> 71151 bytes ...-and-aggregrate-columns-6-webkit-linux.png | Bin 41124 -> 39157 bytes ...nd-aggregrate-columns-7-chromium-linux.png | Bin 43325 -> 41515 bytes ...and-aggregrate-columns-7-firefox-linux.png | Bin 70335 -> 70422 bytes ...-and-aggregrate-columns-7-webkit-linux.png | Bin 40505 -> 38903 bytes 34 files changed, 403 insertions(+), 178 deletions(-) diff --git a/packages/grid/src/GridRange.ts b/packages/grid/src/GridRange.ts index 8f30a5d1ac..48660123dc 100644 --- a/packages/grid/src/GridRange.ts +++ b/packages/grid/src/GridRange.ts @@ -1,16 +1,20 @@ export type GridRangeIndex = number | null; +export type RequiredGridRangeIndex = number; type LeftIndex = GridRangeIndex; type RightIndex = GridRangeIndex; type TopIndex = GridRangeIndex; type BottomIndex = GridRangeIndex; -export type GridCell = { column: number; row: number }; +export type GridCell = { + column: RequiredGridRangeIndex; + row: RequiredGridRangeIndex; +}; export interface BoundedGridRange extends GridRange { - startColumn: number; - startRow: number; - endColumn: number; - endRow: number; + startColumn: RequiredGridRangeIndex; + startRow: RequiredGridRangeIndex; + endColumn: RequiredGridRangeIndex; + endRow: RequiredGridRangeIndex; } // Also exported via GridRange.SELECTION_DIRECTION diff --git a/packages/iris-grid/src/ColumnStatistics.tsx b/packages/iris-grid/src/ColumnStatistics.tsx index 3d6976703c..15c7219144 100644 --- a/packages/iris-grid/src/ColumnStatistics.tsx +++ b/packages/iris-grid/src/ColumnStatistics.tsx @@ -3,15 +3,12 @@ import classNames from 'classnames'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { Button, CopyButton, LoadingSpinner } from '@deephaven/components'; import { dhFreeze, dhRefresh, dhSortSlash, vsLock } from '@deephaven/icons'; -import type { - Column, - ColumnStatistics as APIColumnStatistics, -} from '@deephaven/jsapi-types'; +import type { ColumnStatistics as APIColumnStatistics } from '@deephaven/jsapi-types'; import Log from '@deephaven/log'; import { CancelablePromise, PromiseUtils } from '@deephaven/utils'; import { isExpandableGridModel } from '@deephaven/grid'; import './ColumnStatistics.scss'; -import IrisGridModel from './IrisGridModel'; +import IrisGridModel, { DisplayColumn } from './IrisGridModel'; const log = Log.module('ColumnStatistics'); const STATS_LABEL_OVERRIDES: Record = { @@ -26,14 +23,14 @@ interface Statistic { } interface ColumnStatisticsProps { - column: Column; + column: DisplayColumn; model: IrisGridModel; onStatistics: () => void; } interface ColumnStatisticsState { error: unknown; loading: boolean; - statistics: Statistic[] | null; + statistics: readonly Statistic[] | null; numRows: number; } @@ -84,7 +81,7 @@ class ColumnStatistics extends Component< cancelablePromise: CancelablePromise | null; maybeGenerateStatistics(): void { - const { model } = this.props; + const { column, model } = this.props; const numRows = model.rowCount - @@ -92,7 +89,7 @@ class ColumnStatistics extends Component< model.floatingBottomRowCount - model.floatingTopRowCount; this.setState({ numRows }); - if (!model.isColumnStatisticsAvailable) { + if (!model.isColumnStatisticsAvailable || column.isProxy === true) { this.setState({ loading: false }); } else if (numRows < ColumnStatistics.AUTO_GENERATE_LIMIT) { this.handleGenerateStatistics(); @@ -200,7 +197,7 @@ class ColumnStatistics extends Component< return (
- {column.name} + {column.displayName ?? column.name}  ({columnType}) void; - columns: readonly Column[]; + columns: readonly DisplayColumn[]; } interface CrossColumnSearchState { @@ -233,23 +234,27 @@ class CrossColumnSearch extends PureComponent<
Searched Columns
- {columns.map(column => ( - - this.toggleColumn(column.name)} - > - {column.name} - + {columns.map(column => { + if (column.isProxy === true) return null; - {column.type.substring(column.type.lastIndexOf('.') + 1)} - - ))} + return ( + + this.toggleColumn(column.name)} + > + {column.name} + + + {column.type.substring(column.type.lastIndexOf('.') + 1)} + + ); + })}