Skip to content

Commit 6f736a2

Browse files
committed
refactor: simplify documents matching
1 parent 3f1f531 commit 6f736a2

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

src/components/compare/compare.operations.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ async function compareCurrentApiType(
114114
const { operations: prevOperations = [] } = await versionOperationsResolver(apiType, prev?.version ?? '', prev?.packageId ?? '', undefined, false) || {}
115115
const { operations: currOperations = [] } = await versionOperationsResolver(apiType, curr?.version ?? '', curr?.packageId ?? '', undefined, false) || {}
116116

117-
const [prevOperationIds, prevNormalizedOperationIdToOriginal] = normalizeOperationIds(prevOperations, apiBuilder)
118-
const [currOperationIds, currNormalizedOperationIdToOriginal] = normalizeOperationIds(currOperations, apiBuilder)
117+
const [prevOperationIds, prevNormalizedOperationIdToOperation] = normalizeOperationIds(prevOperations, apiBuilder)
118+
const [currOperationIds, currNormalizedOperationIdToOperation] = normalizeOperationIds(currOperations, apiBuilder)
119119

120120
const added = difference(currOperationIds, prevOperationIds)
121121
const removed = difference(prevOperationIds, currOperationIds)
@@ -130,39 +130,31 @@ async function compareCurrentApiType(
130130
// const currDocuments = ctx.config.files ? unfilteredCurrDocuments.filter(({fileId}) => ctx.config.files?.find((file) => file.fileId === fileId)) : unfilteredCurrDocuments
131131
const currDocuments = unfilteredCurrDocuments
132132

133-
const pairedRestDocs: Map<ResolvedVersionDocument, ResolvedVersionDocument> = new Map()
133+
const pairedRestDocs: [ResolvedVersionDocument, ResolvedVersionDocument][] = []
134134
for (const normalizedOperationId of rest) {
135-
const prevOperationId = prevNormalizedOperationIdToOriginal[normalizedOperationId]
136-
const currOperationId = currNormalizedOperationIdToOriginal[normalizedOperationId]
137-
138-
const prevDocumentId = prevOperations.find((operation) => operation.operationId === prevOperationId)?.documentId
139-
const currDocumentId = currOperations.find((operation) => operation.operationId === currOperationId)?.documentId
135+
const prevDocumentId = prevNormalizedOperationIdToOperation[normalizedOperationId]?.documentId
136+
const currDocumentId = currNormalizedOperationIdToOperation[normalizedOperationId]?.documentId
140137
const prevDoc = prevDocuments.find(document => document.slug === prevDocumentId)
141138
const currDoc = currDocuments.find(document => document.slug === currDocumentId)
142139

143140
if (!prevDoc || !currDoc) {
144141
throw new Error('should not happen')
145142
}
146143

147-
if (pairedRestDocs.get(prevDoc) === currDoc) {
148-
continue
149-
}
150-
pairedRestDocs.set(prevDoc, currDoc)
144+
pairedRestDocs.push([prevDoc, currDoc])
151145
}
152146

153-
const pairedDocs: [ResolvedVersionDocument | undefined, ResolvedVersionDocument | undefined][] = [...pairedRestDocs.entries()]
154-
const qwe = [...new Set(added.map((normalizedOperationId) => {
155-
const operationId = currNormalizedOperationIdToOriginal[normalizedOperationId]
156-
const currDocumentId = currOperations.find((operation) => operation.operationId === operationId)?.documentId
147+
const pairedDocs: [ResolvedVersionDocument | undefined, ResolvedVersionDocument | undefined][] = dedupePairs(pairedRestDocs)
148+
const uniqueCurrentDocuments = [...new Set(added.map((normalizedOperationId) => {
149+
const currDocumentId = currNormalizedOperationIdToOperation[normalizedOperationId]?.documentId
157150
return currDocuments.find(document => document.slug === currDocumentId)
158151
}))]
159-
for (const currDoc of qwe) {
152+
for (const currDoc of uniqueCurrentDocuments) {
160153
pairedDocs.push([undefined, currDoc])
161154
}
162155

163156
const asd = [...new Set(removed.map((normalizedOperationId) => {
164-
const operationId = prevNormalizedOperationIdToOriginal[normalizedOperationId]
165-
const prevDocumentId = prevOperations.find((operation) => operation.operationId === operationId)?.documentId
157+
const prevDocumentId = prevNormalizedOperationIdToOperation[normalizedOperationId]?.documentId
166158
return prevDocuments.find(document => document.slug === prevDocumentId)
167159
}))]
168160
for (const prevDoc of asd) {

src/components/compare/compare.utils.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,33 @@ export function getOperationTypesFromTwoVersions(
9797
type OperationIdWithoutGroupPrefix = string
9898
export type OperationIdentityMap = Record<OperationIdWithoutGroupPrefix, OperationId>
9999

100-
export function normalizeOperationIds(operations: ResolvedOperation[], apiBuilder: ApiBuilder): [OperationId[], Record<NormalizedOperationId | OperationId, OperationId>] {
101-
const normalizedOperationIdToOriginal: Record<NormalizedOperationId | OperationId, OperationId> = {}
100+
export function dedupePairs<A extends object, B extends object>(
101+
pairs: ReadonlyArray<[A, B]>,
102+
): Array<[A, B]> {
103+
const seen = new WeakMap<A, WeakSet<B>>()
104+
const out: Array<[A, B]> = []
105+
106+
for (const [a, b] of pairs) {
107+
let bs = seen.get(a)
108+
if (!bs) {
109+
bs = new WeakSet<B>()
110+
seen.set(a, bs)
111+
}
112+
if (bs.has(b)) continue
113+
bs.add(b)
114+
out.push([a, b])
115+
}
116+
117+
return out
118+
}
119+
120+
export function normalizeOperationIds(operations: ResolvedOperation[], apiBuilder: ApiBuilder): [OperationId[], Record<NormalizedOperationId | OperationId, ResolvedOperation>] {
121+
const normalizedOperationIdToOperation: Record<NormalizedOperationId | OperationId, ResolvedOperation> = {}
102122
for (const operation of operations) {
103123
const normalizedOperationId = apiBuilder.createNormalizedOperationId?.(operation) ?? operation.operationId
104-
normalizedOperationIdToOriginal[normalizedOperationId] = operation.operationId
124+
normalizedOperationIdToOperation[normalizedOperationId] = operation
105125
}
106-
return [Object.keys(normalizedOperationIdToOriginal), normalizedOperationIdToOriginal]
126+
return [Object.keys(normalizedOperationIdToOperation), normalizedOperationIdToOperation]
107127
}
108128

109129
export function getOperationsHashMapByApiType(

0 commit comments

Comments
 (0)