Skip to content

Commit 7683636

Browse files
authored
Show duplicate revisions when experiment finishes running in the workspace (#3641)
1 parent d495fe8 commit 7683636

File tree

7 files changed

+206
-33
lines changed

7 files changed

+206
-33
lines changed

extension/src/experiments/index.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ import {
2121
pickFiltersToRemove
2222
} from './model/filterBy/quickPick'
2323
import { Color } from './model/status/colors'
24+
import {
25+
FetchedExperiment,
26+
hasFinishedWorkspaceExperiment
27+
} from './model/status/collect'
2428
import { UNSELECTED } from './model/status'
2529
import { starredSort } from './model/sortBy/constants'
2630
import { pickSortsToRemove, pickSortToAdd } from './model/sortBy/quickPick'
@@ -240,6 +244,17 @@ export class Experiments extends BaseRepository<TableData> {
240244
return status
241245
}
242246

247+
public checkForFinishedWorkspaceExperiment(
248+
fetchedExperiments: FetchedExperiment[]
249+
) {
250+
if (!hasFinishedWorkspaceExperiment(fetchedExperiments)) {
251+
return
252+
}
253+
254+
this.experiments.unselectWorkspace()
255+
this.notifyChanged()
256+
}
257+
243258
public getSorts() {
244259
return this.experiments.getSorts()
245260
}
@@ -462,10 +477,6 @@ export class Experiments extends BaseRepository<TableData> {
462477
return this.experiments.getRevisions()
463478
}
464479

465-
public getSelectedExperiments() {
466-
return this.experiments.getSelectedExperiments()
467-
}
468-
469480
public async modifyExperimentParamsAndRun(
470481
commandId: ModifiedExperimentAndRunCommandId,
471482
experimentId?: string

extension/src/experiments/model/index.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ import {
2323
isRunningInQueue,
2424
RunningExperiment
2525
} from '../webview/contract'
26-
import {
27-
definedAndNonEmpty,
28-
reorderListSubset,
29-
reorderObjectList
30-
} from '../../util/array'
26+
import { definedAndNonEmpty, reorderListSubset } from '../../util/array'
3127
import {
3228
ExperimentsOutput,
3329
EXPERIMENT_WORKSPACE_ID
@@ -141,8 +137,8 @@ export class ExperimentsModel extends ModelWithPersistence {
141137

142138
const current = this.coloredStatus[id]
143139
if (current) {
144-
this.unassignColor(current)
145140
this.coloredStatus[id] = UNSELECTED
141+
this.unassignColor(current)
146142
} else if (this.availableColors.length > 0) {
147143
this.coloredStatus[id] = this.availableColors.shift() as Color
148144
}
@@ -151,6 +147,10 @@ export class ExperimentsModel extends ModelWithPersistence {
151147
return this.coloredStatus[id]
152148
}
153149

150+
public unselectWorkspace() {
151+
this.coloredStatus[EXPERIMENT_WORKSPACE_ID] = UNSELECTED
152+
}
153+
154154
public hasRunningExperiment() {
155155
return this.running.length > 0
156156
}
@@ -247,10 +247,6 @@ export class ExperimentsModel extends ModelWithPersistence {
247247
return this.getSelectedFromList(() => this.getCombinedList())
248248
}
249249

250-
public getSelectedExperiments() {
251-
return this.getSelectedFromList(() => this.getExperimentsAndQueued())
252-
}
253-
254250
public setSelected(selectedExperiments: Experiment[]) {
255251
if (tooManySelected(selectedExperiments)) {
256252
selectedExperiments = limitToMaxSelected(selectedExperiments)
@@ -474,6 +470,10 @@ export class ExperimentsModel extends ModelWithPersistence {
474470
}
475471

476472
private unassignColor(color: Color) {
473+
if (new Set(Object.values(this.coloredStatus)).has(color)) {
474+
return
475+
}
476+
477477
this.availableColors.unshift(color)
478478
this.availableColors = reorderListSubset(
479479
this.availableColors,
@@ -536,10 +536,10 @@ export class ExperimentsModel extends ModelWithPersistence {
536536
}
537537
}
538538

539-
return reorderObjectList<SelectedExperimentWithColor>(
540-
copyOriginalColors(),
541-
acc,
542-
'displayColor'
543-
)
539+
return copyOriginalColors()
540+
.flatMap(orderedItem =>
541+
acc.filter(item => item.displayColor === orderedItem)
542+
)
543+
.filter(Boolean)
544544
}
545545
}

extension/src/experiments/model/status/collect.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ describe('collectColoredStatus', () => {
246246
expect(availableColors).toStrictEqual(colors.slice(1))
247247
})
248248

249-
it("should reassign the workspace's color when an experiment finishes running in the workspace", () => {
249+
it("should duplicate the workspace's color when an experiment finishes running in the workspace", () => {
250250
const colors = copyOriginalColors()
251251
const { availableColors, coloredStatus } = collectColoredStatus(
252252
[
@@ -269,7 +269,7 @@ describe('collectColoredStatus', () => {
269269
)
270270
expect(coloredStatus).toStrictEqual({
271271
'exp-1': colors[0],
272-
workspace: UNSELECTED
272+
workspace: colors[0]
273273
})
274274

275275
expect(availableColors).toStrictEqual(colors.slice(1))

extension/src/experiments/model/status/collect.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const removeUnselectedExperimentRunningInWorkspace = (
7777
}
7878
}
7979

80-
const reassignFinishedWorkspaceExperiment = (
80+
const duplicateFinishedWorkspaceExperiment = (
8181
coloredStatus: ColoredStatus,
8282
finishedRunning: { [id: string]: string }
8383
): void => {
@@ -87,7 +87,6 @@ const reassignFinishedWorkspaceExperiment = (
8787
}
8888

8989
coloredStatus[id] = coloredStatus.workspace
90-
coloredStatus.workspace = UNSELECTED
9190
}
9291
}
9392

@@ -143,7 +142,7 @@ export const collectColoredStatus = (
143142
removeUnselectedExperimentRunningInWorkspace(coloredStatus, experiment)
144143
}
145144

146-
reassignFinishedWorkspaceExperiment(coloredStatus, finishedRunning)
145+
duplicateFinishedWorkspaceExperiment(coloredStatus, finishedRunning)
147146

148147
return { availableColors, coloredStatus }
149148
}
@@ -310,3 +309,28 @@ export const collectFinishedRunningExperiments = (
310309
}
311310
return acc
312311
}
312+
313+
export type FetchedExperiment = { id?: string; displayColor: Color }
314+
315+
export const hasFinishedWorkspaceExperiment = (
316+
fetchedExperiments: FetchedExperiment[]
317+
): boolean => {
318+
let workspace: FetchedExperiment | undefined
319+
const nonWorkspace: FetchedExperiment[] = []
320+
321+
for (const revision of fetchedExperiments) {
322+
if (revision.id === EXPERIMENT_WORKSPACE_ID) {
323+
workspace = revision
324+
continue
325+
}
326+
nonWorkspace.push(revision)
327+
}
328+
329+
if (!workspace) {
330+
return false
331+
}
332+
333+
return nonWorkspace.some(
334+
({ displayColor }) => displayColor === workspace?.displayColor
335+
)
336+
}

extension/src/plots/model/index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,16 +196,17 @@ export class PlotsModel extends ModelWithPersistence {
196196
}
197197

198198
public getSelectedRevisionDetails() {
199-
return this.experiments.getSelectedRevisions().map(exp => {
199+
const selectedRevisions: Revision[] = []
200+
for (const experiment of this.experiments.getSelectedRevisions()) {
200201
const { commit, displayName, label, displayColor, logicalGroupName, id } =
201-
exp
202+
experiment
202203
const revision: Revision = {
203204
displayColor,
204205
errors: this.errors.getRevisionErrors(label),
205206
fetched: this.fetchedRevs.has(label),
206207
firstThreeColumns: getRevisionFirstThreeColumns(
207208
this.experiments.getFirstThreeColumnOrder(),
208-
exp
209+
experiment
209210
),
210211
group: logicalGroupName,
211212
id,
@@ -215,8 +216,10 @@ export class PlotsModel extends ModelWithPersistence {
215216
if (commit) {
216217
revision.commit = displayName
217218
}
218-
return revision
219-
})
219+
selectedRevisions.push(revision)
220+
}
221+
222+
return selectedRevisions
220223
}
221224

222225
public getTemplatePlots(

extension/src/plots/webview/messages.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ export class WebviewMessages {
5757
this.updateData = updateData
5858
}
5959

60-
public sendWebviewMessage() {
60+
public async sendWebviewMessage() {
6161
const selectedRevisions = this.plots.getSelectedRevisionDetails()
62-
void this.getWebview()?.show({
62+
63+
await this.getWebview()?.show({
6364
cliError: this.errors.getCliError()?.error || null,
6465
comparison: this.getComparisonPlots(),
6566
custom: this.getCustomPlots(),
@@ -69,6 +70,10 @@ export class WebviewMessages {
6970
selectedRevisions,
7071
template: this.getTemplatePlots(selectedRevisions)
7172
})
73+
74+
this.experiments.checkForFinishedWorkspaceExperiment(
75+
selectedRevisions.filter(({ fetched }) => fetched)
76+
)
7277
}
7378

7479
public handleMessageFromWebview(message: MessageFromWebview) {

0 commit comments

Comments
 (0)