Skip to content

Commit

Permalink
Fixed NamedVersion Index And Job Posting (#81)
Browse files Browse the repository at this point in the history
  • Loading branch information
CalebGerman authored Feb 14, 2024
1 parent 1f499cb commit 0b6b5b0
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 22 deletions.
14 changes: 14 additions & 0 deletions packages/changed-elements-react/src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,17 @@ export async function* skip<T>(iterable: AsyncIterable<T>, n: number): AsyncGene

return result.value;
}

export async function tryXTimes<T>(func: () => Promise<T>, attempts: number, delayInMilliseconds: number = 5000): Promise<T> {
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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -208,24 +209,32 @@ type PostOrRunComparisonJobResult = {
};

const createOrRunManagerStartComparisonV2 = async (args: RunStartComparisonV2Args): Promise<PostOrRunComparisonJobResult> => {
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) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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,
Expand Down Expand Up @@ -167,15 +167,31 @@ 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;
if (namedVersionsOlderThanCurrentVersion.length === 0) {
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<number, Changeset>();
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 = {
Expand Down

0 comments on commit 0b6b5b0

Please sign in to comment.