From 0b6b5b0dd6ca6b4a1745fdf7102072714b48b915 Mon Sep 17 00:00:00 2001 From: CalebGerman <86487204+CalebGerman@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:34:04 -0600 Subject: [PATCH] Fixed NamedVersion Index And Job Posting (#81) --- .../changed-elements-react/src/utils/utils.ts | 14 ++++++ .../components/VersionCompareSelectModal.tsx | 43 +++++++++++-------- .../hooks/useNamedVersionLoader.tsx | 26 ++++++++--- 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/packages/changed-elements-react/src/utils/utils.ts b/packages/changed-elements-react/src/utils/utils.ts index a39ecb7a..3a9a328c 100644 --- a/packages/changed-elements-react/src/utils/utils.ts +++ b/packages/changed-elements-react/src/utils/utils.ts @@ -55,3 +55,17 @@ export async function* skip(iterable: AsyncIterable, n: number): AsyncGene return result.value; } + +export async function tryXTimes(func: () => Promise, attempts: number, delayInMilliseconds: number = 5000): Promise { + let error: unknown = null; + while (attempts > 0) { + try { + return await func(); + } catch (err) { + attempts--; + error = err; + await new Promise((resolve) => setTimeout(resolve, delayInMilliseconds)); + } + } + throw error; +} diff --git a/packages/changed-elements-react/src/widgets/comparisonJobWidget/components/VersionCompareSelectModal.tsx b/packages/changed-elements-react/src/widgets/comparisonJobWidget/components/VersionCompareSelectModal.tsx index 49c69156..40fe1b41 100644 --- a/packages/changed-elements-react/src/widgets/comparisonJobWidget/components/VersionCompareSelectModal.tsx +++ b/packages/changed-elements-react/src/widgets/comparisonJobWidget/components/VersionCompareSelectModal.tsx @@ -16,6 +16,7 @@ import { VersionCompareUtils, VersionCompareVerboseMessages } from "../../../api import { NamedVersion } from "../../../clients/iModelsClient"; import { VersionCompare } from "../../../api/VersionCompare"; import "./styles/ComparisonJobWidget.scss"; +import { tryXTimes } from "../../../utils/utils"; /** Options for VersionCompareSelectDialogV2. */ @@ -208,24 +209,32 @@ type PostOrRunComparisonJobResult = { }; const createOrRunManagerStartComparisonV2 = async (args: RunStartComparisonV2Args): Promise => { - const { comparisonJob } = await postOrGetComparisonJob({ - changedElementsClient: args.comparisonJobClient, - iTwinId: args.iModelConnection?.iTwinId as string, - iModelId: args.iModelConnection?.iModelId as string, - startChangesetId: args.targetVersion.changesetId as string, - endChangesetId: args.currentVersion.changesetId as string, - }); - if (comparisonJob.status === "Completed") { - void runManagerStartComparisonV2({ - comparisonJob: { comparisonJob: comparisonJob }, - comparisonJobClient: args.comparisonJobClient, - iModelConnection: args.iModelConnection, - targetVersion: args.targetVersion, - currentVersion: args.currentVersion, - }); - return { startedComparison: true }; + try { + const comparisonJob = await tryXTimes(async () => { + const job = (await postOrGetComparisonJob({ + changedElementsClient: args.comparisonJobClient, + iTwinId: args.iModelConnection?.iTwinId as string, + iModelId: args.iModelConnection?.iModelId as string, + startChangesetId: args.targetVersion.changesetId as string, + endChangesetId: args.currentVersion.changesetId as string, + })).comparisonJob; + return job; + }, 3); + if (comparisonJob.status === "Completed") { + void runManagerStartComparisonV2({ + comparisonJob: { comparisonJob: comparisonJob }, + comparisonJobClient: args.comparisonJobClient, + iModelConnection: args.iModelConnection, + targetVersion: args.targetVersion, + currentVersion: args.currentVersion, + }); + return { startedComparison: true }; + } + return { startedComparison: false }; + } catch (error) { + toastComparisonJobError(args.currentVersion, args.targetVersion); + throw error; } - return { startedComparison: false }; }; const pollForComparisonJobTillComplete = async (args: RunStartComparisonV2Args) => { diff --git a/packages/changed-elements-react/src/widgets/comparisonJobWidget/hooks/useNamedVersionLoader.tsx b/packages/changed-elements-react/src/widgets/comparisonJobWidget/hooks/useNamedVersionLoader.tsx index a372dc02..ba2dc0ea 100644 --- a/packages/changed-elements-react/src/widgets/comparisonJobWidget/hooks/useNamedVersionLoader.tsx +++ b/packages/changed-elements-react/src/widgets/comparisonJobWidget/hooks/useNamedVersionLoader.tsx @@ -71,8 +71,8 @@ export const useNamedVersionLoader = ( iModelsClient.getChangesets({ iModelId }).then((changesets) => changesets.slice().reverse()), ]); const currentNamedVersion = getOrCreateCurrentNamedVersion(namedVersions, currentChangeSetId, changesets, currentChangeSetIndex); - const sortedNamedVersions = sortNamedVersions(namedVersions, currentNamedVersion, setResultNoNamedVersions); - if (!sortedNamedVersions || sortedNamedVersions.length === 0) { + const sortedAndOffsetNamedVersions = sortAndSetIndexOfNamedVersions(namedVersions, currentNamedVersion, setResultNoNamedVersions,changesets); + if (!sortedAndOffsetNamedVersions || sortedAndOffsetNamedVersions.length === 0) { setResultNoNamedVersions(); return; } @@ -87,7 +87,7 @@ export const useNamedVersionLoader = ( const currentState: NamedVersionLoaderState = { result: { namedVersions: { - entries: sortedNamedVersions.map((namedVersion) => ({ + entries: sortedAndOffsetNamedVersions.map((namedVersion) => ({ version: namedVersion, state: VersionProcessedState.Verifying, jobStatus: initialComparisonJobStatus, @@ -167,7 +167,7 @@ const getCurrentFromChangeSet = (changeSets: Changeset[], currentChangeSetId: st return; }; -const sortNamedVersions = (namedVersions: NamedVersion[], currentNamedVersion: NamedVersion, onError: () => void) => { +const sortAndSetIndexOfNamedVersions = (namedVersions: NamedVersion[], currentNamedVersion: NamedVersion, onError: () => void, changesets: Changeset[]) => { //if current index is 0 then no need to filter. All change sets are older than current. const namedVersionsOlderThanCurrentVersion = currentNamedVersion.changesetIndex !== 0 ? namedVersions.filter(version => version.changesetIndex <= currentNamedVersion.changesetIndex) : namedVersions; @@ -175,7 +175,23 @@ const sortNamedVersions = (namedVersions: NamedVersion[], currentNamedVersion: N onError(); return; } - return namedVersionsOlderThanCurrentVersion.reverse(); + const reversedNamedVersions = namedVersionsOlderThanCurrentVersion.reverse() + if (reversedNamedVersions[0].changesetIndex === currentNamedVersion.changesetIndex) { + reversedNamedVersions.shift(); //remove current named version + } + const changeSetMap = new Map(); + changesets.forEach((changeset: Changeset) => { + changeSetMap.set(changeset.index, changeset); + }) + // we must offset the named versions , because that changeset is "already applied" to the named version, see this: + // https://developer.bentley.com/tutorials/changed-elements-api/#221-using-the-api-to-get-changed-elements + // this assuming latest is current + const offSetNameVersions = reversedNamedVersions.map((version) => { + version.changesetIndex = version.changesetIndex + 1; + version.changesetId = changeSetMap.get(version.changesetIndex)?.id ?? version.changesetId + return version; + }) + return offSetNameVersions; }; type ProcessChangesetsArgs = {