Skip to content

Commit d92c91e

Browse files
authored
feat: Add support for multi-partition parquet:kv tables (#1580)
Added feature to `IrisGridPartitionSelector` to display additional partition selector dropdowns when more than one partition column is present. The values displayed in the dropdown depend on the selected partitions of columns to the left of it. The "Append Command" button and associated functions are removed in preparation for #1143. Closes #1438 #### Testing instructions: 1. Create and open a multi-partition table: ```python from deephaven import empty_table part = empty_table(4).update("II=ii") from deephaven.parquet import write, read write(part, "/tmp/pt-1438/x=0/y=0/part.parquet") write(part, "/tmp/pt-1438/x=0/y=1/part.parquet") write(part, "/tmp/pt-1438/x=1/y=0/part.parquet") write(part, "/tmp/pt-1438/x=1/y=1/part.parquet") partition_table = read("/tmp/pt-1438") ``` 2. Use the dropdown to select any combination of partitions and check that it updates the table correctly. * The dropdown should only display values that are available after filtering for all the partitions left of it. (E.g. A state/province dropdown should only contain the states/provinces corresponding to the selected country.) 3. Test filtering by typing directly in the dropdown and searching by using the search bar above the list of available partitions. 4. Retest using other data types for partition columns (dates, strings, chars, doubles). E.g: ```python from deephaven.parquet import write, read write(part, "/tmp/pt2-1438/date_partition=2023-08-01/id_partition=id-001/decimal=0.1/part.parquet") write(part, "/tmp/pt2-1438/date_partition=2023-08-01/id_partition=id-002/decimal=0.15/part.parquet") write(part, "/tmp/pt2-1438/date_partition=2023-08-02/id_partition=id-001/decimal=0.08/part.parquet") write(part, "/tmp/pt2-1438/date_partition=2023-08-02/id_partition=id-002/decimal=0.08/part.parquet") write(part, "/tmp/pt2-1438/date_partition=2023-08-02/id_partition=id-003/decimal=0.1/part.parquet") partition_table = read("/tmp/pt2-1438") ``` --------- Co-authored-by: georgecwan <georgecwan@users.noreply.github.com>
1 parent fc543aa commit d92c91e

13 files changed

Lines changed: 593 additions & 314 deletions

packages/code-studio/src/styleguide/MockIrisGridTreeModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ class MockIrisGridTreeModel
324324
throw new Error('Not defined in mock');
325325
}
326326

327-
valuesTable(column: Column): Promise<never> {
327+
valuesTable(columns: Column | Column[]): Promise<never> {
328328
throw new Error('Not defined in mock');
329329
}
330330

packages/dashboard-core-plugins/src/panels/ChartPanel.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ export interface GLChartPanelState {
113113
sorts: unknown;
114114
};
115115
irisGridPanelState?: {
116-
partitionColumn: string;
117-
partition: unknown;
116+
partitionColumns: string[];
117+
partitions: unknown[];
118118
};
119119
table?: string;
120120
figure?: string;

packages/dashboard-core-plugins/src/panels/IrisGridPanel.tsx

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
IrisGridState,
4040
ChartBuilderSettings,
4141
DehydratedIrisGridState,
42+
DehydratedIrisGridPanelState,
4243
ColumnHeaderGroup,
4344
IrisGridContextMenuData,
4445
IrisGridTableModel,
@@ -78,7 +79,7 @@ import type {
7879
TablePluginComponent,
7980
TablePluginElement,
8081
} from '@deephaven/plugin';
81-
import { ConsoleEvent, InputFilterEvent, IrisGridEvent } from '../events';
82+
import { InputFilterEvent, IrisGridEvent } from '../events';
8283
import {
8384
getInputFiltersForDashboard,
8485
getLinksForDashboard,
@@ -114,23 +115,20 @@ export interface PanelState {
114115
movedRows: MoveOperation[];
115116
};
116117
irisGridState: DehydratedIrisGridState;
117-
irisGridPanelState: {
118-
partitionColumn: ColumnName | null;
119-
partition: string | null;
120-
isSelectingPartition: boolean;
121-
advancedSettings: [AdvancedSettingsType, boolean][];
122-
};
118+
irisGridPanelState: DehydratedIrisGridPanelState;
123119
pluginState: unknown;
124120
}
125121

126122
// Some of the properties in the loaded panel state may be omitted
127123
// even though they can't be undefined in the dehydrated state.
128124
// This can happen when loading the state saved before the properties were added.
129125
type LoadedPanelState = PanelState & {
130-
irisGridPanelState: PanelState['irisGridPanelState'] &
131-
Partial<
132-
Pick<PanelState['irisGridPanelState'], 'partition' | 'partitionColumn'>
133-
>;
126+
irisGridPanelState: PanelState['irisGridPanelState'] & {
127+
partitions?: (string | null)[];
128+
partitionColumns?: ColumnName[];
129+
partition?: string | null;
130+
partitionColumn?: ColumnName | null;
131+
};
134132
};
135133

136134
export interface OwnProps extends DashboardPanelProps {
@@ -190,8 +188,8 @@ interface IrisGridPanelState {
190188
movedColumns: readonly MoveOperation[];
191189
movedRows: readonly MoveOperation[];
192190
isSelectingPartition: boolean;
193-
partition: string | null;
194-
partitionColumn: Column | null;
191+
partitions: (string | null)[];
192+
partitionColumns: Column[];
195193
rollupConfig?: UIRollupConfig;
196194
showSearchBar: boolean;
197195
searchValue: string;
@@ -252,7 +250,6 @@ export class IrisGridPanel extends PureComponent<
252250
this.handleError = this.handleError.bind(this);
253251
this.handleGridStateChange = this.handleGridStateChange.bind(this);
254252
this.handlePluginStateChange = this.handlePluginStateChange.bind(this);
255-
this.handlePartitionAppend = this.handlePartitionAppend.bind(this);
256253
this.handleCreateChart = this.handleCreateChart.bind(this);
257254
this.handleResize = this.handleResize.bind(this);
258255
this.handleShow = this.handleShow.bind(this);
@@ -298,8 +295,8 @@ export class IrisGridPanel extends PureComponent<
298295
movedColumns: [],
299296
movedRows: [],
300297
isSelectingPartition: false,
301-
partition: null,
302-
partitionColumn: null,
298+
partitions: [],
299+
partitionColumns: [],
303300
rollupConfig: undefined,
304301
showSearchBar: false,
305302
searchValue: '',
@@ -460,14 +457,14 @@ export class IrisGridPanel extends PureComponent<
460457
(
461458
model: IrisGridModel,
462459
isSelectingPartition: boolean,
463-
partition: string | null,
464-
partitionColumn: Column | null,
460+
partitions: (string | null)[],
461+
partitionColumns: Column[],
465462
advancedSettings: Map<AdvancedSettingsType, boolean>
466463
) =>
467464
IrisGridUtils.dehydrateIrisGridPanelState(model, {
468465
isSelectingPartition,
469-
partition,
470-
partitionColumn,
466+
partitions,
467+
partitionColumns,
471468
advancedSettings,
472469
})
473470
);
@@ -713,14 +710,6 @@ export class IrisGridPanel extends PureComponent<
713710
glEventHub.emit(InputFilterEvent.TABLE_CHANGED, this, table);
714711
}
715712

716-
handlePartitionAppend(column: Column, value: unknown): void {
717-
const { glEventHub } = this.props;
718-
const { name } = column;
719-
const tableName = this.getTableName();
720-
const command = `${tableName} = ${tableName}.where("${name}=\`${value}\`")`;
721-
glEventHub.emit(ConsoleEvent.SEND_COMMAND, command, false, true);
722-
}
723-
724713
/**
725714
* Create a chart with the specified settings
726715
* @param settings The settings from the chart builder
@@ -1044,8 +1033,8 @@ export class IrisGridPanel extends PureComponent<
10441033
}
10451034
const {
10461035
isSelectingPartition,
1047-
partition,
1048-
partitionColumn,
1036+
partitions,
1037+
partitionColumns,
10491038
advancedSettings,
10501039
} = IrisGridUtils.hydrateIrisGridPanelState(model, irisGridPanelState);
10511040
assertNotNull(this.irisGridUtils);
@@ -1090,8 +1079,8 @@ export class IrisGridPanel extends PureComponent<
10901079
isSelectingPartition,
10911080
movedColumns,
10921081
movedRows,
1093-
partition,
1094-
partitionColumn,
1082+
partitions,
1083+
partitionColumns,
10951084
quickFilters,
10961085
reverseType,
10971086
rollupConfig,
@@ -1123,8 +1112,8 @@ export class IrisGridPanel extends PureComponent<
11231112
model,
11241113
panelState: oldPanelState,
11251114
isSelectingPartition,
1126-
partition,
1127-
partitionColumn,
1115+
partitions,
1116+
partitionColumns,
11281117
advancedSettings,
11291118
} = this.state;
11301119
const {
@@ -1159,8 +1148,8 @@ export class IrisGridPanel extends PureComponent<
11591148
this.getDehydratedIrisGridPanelState(
11601149
model,
11611150
isSelectingPartition,
1162-
partition,
1163-
partitionColumn,
1151+
partitions,
1152+
partitionColumns,
11641153
advancedSettings
11651154
),
11661155
this.getDehydratedIrisGridState(
@@ -1247,8 +1236,8 @@ export class IrisGridPanel extends PureComponent<
12471236
model,
12481237
movedColumns,
12491238
movedRows,
1250-
partition,
1251-
partitionColumn,
1239+
partitions,
1240+
partitionColumns,
12521241
quickFilters,
12531242
reverseType,
12541243
rollupConfig,
@@ -1329,8 +1318,8 @@ export class IrisGridPanel extends PureComponent<
13291318
isStuckToRight={isStuckToRight}
13301319
movedColumns={movedColumns}
13311320
movedRows={movedRows}
1332-
partition={partition}
1333-
partitionColumn={partitionColumn}
1321+
partitions={partitions}
1322+
partitionColumns={partitionColumns}
13341323
quickFilters={quickFilters}
13351324
reverseType={reverseType}
13361325
rollupConfig={rollupConfig}
@@ -1348,7 +1337,6 @@ export class IrisGridPanel extends PureComponent<
13481337
onCreateChart={this.handleCreateChart}
13491338
onDataSelected={this.handleDataSelected}
13501339
onError={this.handleError}
1351-
onPartitionAppend={this.handlePartitionAppend}
13521340
onStateChange={this.handleGridStateChange}
13531341
onContextMenu={this.handleContextMenu}
13541342
onAdvancedSettingsChange={this.handleAdvancedSettingsChange}

0 commit comments

Comments
 (0)