Skip to content

Commit ff62021

Browse files
committed
tweak types to be more generic
1 parent 73cbfcf commit ff62021

19 files changed

+610
-641
lines changed
Lines changed: 80 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,101 @@
11
import React from 'react'
22

3-
import {
4-
type AdjacencyListColumnKey,
5-
type AdjacencyListKey,
6-
type PortId,
7-
} from '../utils'
3+
import { type PortId } from '../utils'
84

95
export type LineageColumn = {
106
source?: string | null
117
expression?: string | null
128
models: Record<string, string[]>
139
}
1410

15-
export type ColumnLevelModelConnections = Record<
16-
AdjacencyListKey,
17-
AdjacencyListKey[]
18-
>
19-
export type ColumnLevelDetails = Omit<LineageColumn, 'models'> & {
20-
models: ColumnLevelModelConnections
11+
export type ColumnLevelModelConnections<
12+
TAdjacencyListKey extends string,
13+
TAdjacencyListColumnKey extends string,
14+
> = Record<TAdjacencyListKey, TAdjacencyListColumnKey[]>
15+
export type ColumnLevelDetails<
16+
TAdjacencyListKey extends string,
17+
TAdjacencyListColumnKey extends string,
18+
> = Omit<LineageColumn, 'models'> & {
19+
models: ColumnLevelModelConnections<
20+
TAdjacencyListKey,
21+
TAdjacencyListColumnKey
22+
>
2123
}
22-
export type ColumnLevelConnections = Record<
23-
AdjacencyListColumnKey,
24-
ColumnLevelDetails
24+
export type ColumnLevelConnections<
25+
TAdjacencyListKey extends string,
26+
TAdjacencyListColumnKey extends string,
27+
> = Record<
28+
TAdjacencyListColumnKey,
29+
ColumnLevelDetails<TAdjacencyListKey, TAdjacencyListColumnKey>
2530
>
26-
export type ColumnLevelLineageAdjacencyList = Record<
27-
AdjacencyListKey,
28-
ColumnLevelConnections
31+
export type ColumnLevelLineageAdjacencyList<
32+
TAdjacencyListKey extends string,
33+
TAdjacencyListColumnKey extends string,
34+
> = Record<
35+
TAdjacencyListKey,
36+
ColumnLevelConnections<TAdjacencyListKey, TAdjacencyListColumnKey>
2937
>
3038

31-
export type ColumnLevelLineageContextValue = {
32-
adjacencyListColumnLevel: ColumnLevelLineageAdjacencyList
33-
selectedColumns: Set<PortId>
34-
columnLevelLineage: Map<PortId, ColumnLevelLineageAdjacencyList>
39+
export type ColumnLevelLineageContextValue<
40+
TAdjacencyListKey extends string,
41+
TAdjacencyListColumnKey extends string,
42+
TColumnID extends string = PortId,
43+
> = {
44+
adjacencyListColumnLevel: ColumnLevelLineageAdjacencyList<
45+
TAdjacencyListKey,
46+
TAdjacencyListColumnKey
47+
>
48+
selectedColumns: Set<TColumnID>
49+
columnLevelLineage: Map<
50+
TColumnID,
51+
ColumnLevelLineageAdjacencyList<TAdjacencyListKey, TAdjacencyListColumnKey>
52+
>
3553
setColumnLevelLineage: React.Dispatch<
36-
React.SetStateAction<Map<PortId, ColumnLevelLineageAdjacencyList>>
54+
React.SetStateAction<
55+
Map<
56+
TColumnID,
57+
ColumnLevelLineageAdjacencyList<
58+
TAdjacencyListKey,
59+
TAdjacencyListColumnKey
60+
>
61+
>
62+
>
3763
>
3864
showColumns: boolean
3965
setShowColumns: React.Dispatch<React.SetStateAction<boolean>>
40-
fetchingColumns: Set<PortId>
41-
setFetchingColumns: React.Dispatch<React.SetStateAction<Set<PortId>>>
66+
fetchingColumns: Set<TColumnID>
67+
setFetchingColumns: React.Dispatch<React.SetStateAction<Set<TColumnID>>>
4268
}
4369

44-
export const initial = {
45-
adjacencyListColumnLevel: {},
46-
selectedColumns: new Set<PortId>(),
47-
columnLevelLineage: new Map<PortId, ColumnLevelLineageAdjacencyList>(),
48-
setColumnLevelLineage: () => {},
49-
showColumns: false,
50-
setShowColumns: () => {},
51-
fetchingColumns: new Set<PortId>(),
52-
setFetchingColumns: () => {},
70+
export function getInitial<
71+
TAdjacencyListKey extends string,
72+
TAdjacencyListColumnKey extends string,
73+
TColumnID extends string = PortId,
74+
>() {
75+
return {
76+
adjacencyListColumnLevel: {},
77+
columnLevelLineage: new Map<
78+
TColumnID,
79+
ColumnLevelLineageAdjacencyList<
80+
TAdjacencyListKey,
81+
TAdjacencyListColumnKey
82+
>
83+
>(),
84+
setColumnLevelLineage: () => {},
85+
showColumns: false,
86+
setShowColumns: () => {},
87+
selectedColumns: new Set<TColumnID>(),
88+
fetchingColumns: new Set<TColumnID>(),
89+
setFetchingColumns: () => {},
90+
} as const
5391
}
5492

55-
export type ColumnLevelLineageContextHook = () => ColumnLevelLineageContextValue
93+
export type ColumnLevelLineageContextHook<
94+
TAdjacencyListKey extends string,
95+
TAdjacencyListColumnKey extends string,
96+
TColumnID extends string = PortId,
97+
> = () => ColumnLevelLineageContextValue<
98+
TAdjacencyListKey,
99+
TAdjacencyListColumnKey,
100+
TColumnID
101+
>

web/common/src/components/Lineage/LineageColumnLevel/FactoryColumn.tsx

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import React from 'react'
1010
import { cn } from '@/utils'
1111
import { NodeBadge } from '../node/NodeBadge'
1212
import { NodePort } from '../node/NodePort'
13-
import {
14-
type AdjacencyListColumnKey,
15-
type AdjacencyListKey,
16-
type NodeId,
17-
type PortId,
18-
} from '../utils'
13+
import { type NodeId, type PortId } from '../utils'
1914
import {
2015
type ColumnLevelLineageAdjacencyList,
2116
type ColumnLevelLineageContextHook,
@@ -26,7 +21,18 @@ import { HorizontalContainer } from '@/components/HorizontalContainer/Horizontal
2621
import { Information } from '@/components/Typography/Information'
2722
import { LoadingContainer } from '@/components/LoadingContainer/LoadingContainer'
2823

29-
export function FactoryColumn(useLineage: ColumnLevelLineageContextHook) {
24+
export function FactoryColumn<
25+
TAdjacencyListKey extends string,
26+
TAdjacencyListColumnKey extends string,
27+
TNodeID extends string = NodeId,
28+
TColumnID extends string = PortId,
29+
>(
30+
useLineage: ColumnLevelLineageContextHook<
31+
TAdjacencyListKey,
32+
TAdjacencyListColumnKey,
33+
TColumnID
34+
>,
35+
) {
3036
return React.memo(function FactoryColumn({
3137
id,
3238
nodeId,
@@ -44,14 +50,17 @@ export function FactoryColumn(useLineage: ColumnLevelLineageContextHook) {
4450
onClick,
4551
onCancel,
4652
}: {
47-
id: PortId
48-
nodeId: NodeId
49-
modelName: AdjacencyListKey
50-
name: AdjacencyListColumnKey
53+
id: TColumnID
54+
nodeId: TNodeID
55+
modelName: TAdjacencyListKey
56+
name: TAdjacencyListColumnKey
5157
type: string
5258
description?: string | null
5359
className?: string
54-
data?: ColumnLevelLineageAdjacencyList
60+
data?: ColumnLevelLineageAdjacencyList<
61+
TAdjacencyListKey,
62+
TAdjacencyListColumnKey
63+
>
5564
isFetching?: boolean
5665
error?: Error | null
5766
renderError?: (error: Error) => React.ReactNode

web/common/src/components/Lineage/LineageColumnLevel/help.ts

Lines changed: 68 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { toEdgeID, toNodeID, toPortID } from '../utils'
21
import {
3-
type AdjacencyListColumnKey,
4-
type AdjacencyListKey,
5-
type EdgeId,
2+
toEdgeID,
3+
toNodeID,
4+
toPortID,
65
type LineageEdge,
76
type LineageEdgeData,
7+
type EdgeId,
88
type NodeId,
99
type PortId,
1010
type TransformEdgeFn,
@@ -17,28 +17,34 @@ import {
1717

1818
export const MAX_COLUMNS_TO_DISPLAY = 5
1919

20-
export function getAdjacencyListKeysFromColumnLineage(
21-
columnLineage: ColumnLevelLineageAdjacencyList,
20+
export function getAdjacencyListKeysFromColumnLineage<
21+
TAdjacencyListKey extends string,
22+
TAdjacencyListColumnKey extends string,
23+
>(
24+
columnLineage: ColumnLevelLineageAdjacencyList<
25+
TAdjacencyListKey,
26+
TAdjacencyListColumnKey
27+
>,
2228
) {
23-
const adjacencyListKeys = new Set<AdjacencyListKey>()
29+
const adjacencyListKeys = new Set<TAdjacencyListKey>()
2430

2531
const targets = Object.entries(columnLineage) as [
26-
AdjacencyListKey,
27-
ColumnLevelConnections,
32+
TAdjacencyListKey,
33+
ColumnLevelConnections<TAdjacencyListKey, TAdjacencyListColumnKey>,
2834
][]
2935

3036
for (const [sourceModelName, targetColumns] of targets) {
3137
adjacencyListKeys.add(sourceModelName)
3238

3339
const targetConnections = Object.entries(targetColumns) as [
34-
AdjacencyListColumnKey,
35-
ColumnLevelDetails,
40+
TAdjacencyListColumnKey,
41+
ColumnLevelDetails<TAdjacencyListKey, TAdjacencyListColumnKey>,
3642
][]
3743

3844
for (const [, { models: sourceModels }] of targetConnections) {
3945
for (const targetModelName of Object.keys(
4046
sourceModels,
41-
) as AdjacencyListKey[]) {
47+
) as TAdjacencyListKey[]) {
4248
adjacencyListKeys.add(targetModelName)
4349
}
4450
}
@@ -48,55 +54,69 @@ export function getAdjacencyListKeysFromColumnLineage(
4854
}
4955

5056
export function getEdgesFromColumnLineage<
57+
TAdjacencyListKey extends string,
58+
TAdjacencyListColumnKey extends string,
5159
TEdgeData extends LineageEdgeData = LineageEdgeData,
60+
TEdgeID extends string = EdgeId,
61+
TNodeID extends string = NodeId,
62+
TPortID extends string = PortId,
5263
>({
53-
columnLineage = {},
64+
columnLineage,
5465
transformEdge,
5566
}: {
56-
columnLineage: ColumnLevelLineageAdjacencyList
57-
transformEdge: TransformEdgeFn<TEdgeData>
67+
columnLineage: ColumnLevelLineageAdjacencyList<
68+
TAdjacencyListKey,
69+
TAdjacencyListColumnKey
70+
>
71+
transformEdge: TransformEdgeFn<TEdgeData, TNodeID, TEdgeID, TPortID>
5872
}) {
59-
const edges: LineageEdge<TEdgeData>[] = []
60-
const modelLevelEdgeIDs = new Map<EdgeId, [NodeId, NodeId]>()
73+
const edges: LineageEdge<TEdgeData, TNodeID, TEdgeID, TPortID>[] = []
74+
const modelLevelEdgeIDs = new Map<TEdgeID, [TNodeID, TNodeID]>()
6175
const targets = Object.entries(columnLineage || {}) as [
62-
AdjacencyListKey,
63-
ColumnLevelConnections,
76+
TAdjacencyListKey,
77+
ColumnLevelConnections<TAdjacencyListKey, TAdjacencyListColumnKey>,
6478
][]
6579

6680
for (const [targetModelName, targetColumns] of targets) {
6781
const targetConnections = Object.entries(targetColumns) as [
68-
AdjacencyListColumnKey,
69-
ColumnLevelDetails,
82+
TAdjacencyListColumnKey,
83+
ColumnLevelDetails<TAdjacencyListKey, TAdjacencyListColumnKey>,
7084
][]
7185

72-
const targetNodeId = toNodeID(targetModelName)
86+
const targetNodeId = toNodeID<TNodeID>(targetModelName)
7387

7488
for (const [
7589
targetColumnName,
7690
{ models: sourceModels },
7791
] of targetConnections) {
7892
const sources = Object.entries(sourceModels) as [
79-
AdjacencyListKey,
80-
AdjacencyListKey[],
93+
TAdjacencyListKey,
94+
TAdjacencyListColumnKey[],
8195
][]
8296

8397
for (const [sourceModelName, sourceColumns] of sources) {
84-
const sourceNodeId = toNodeID(sourceModelName)
98+
const sourceNodeId = toNodeID<TNodeID>(sourceModelName)
8599

86-
modelLevelEdgeIDs.set(toEdgeID(sourceModelName, targetModelName), [
87-
sourceNodeId,
88-
targetNodeId,
89-
])
100+
modelLevelEdgeIDs.set(
101+
toEdgeID<TEdgeID>(sourceModelName, targetModelName),
102+
[sourceNodeId, targetNodeId],
103+
)
90104

91105
sourceColumns.forEach(sourceColumnName => {
92-
const edgeId = toEdgeID(
106+
const edgeId = toEdgeID<TEdgeID>(
107+
sourceModelName,
108+
sourceColumnName,
109+
targetModelName,
110+
targetColumnName,
111+
)
112+
const sourceColumnId = toPortID<TPortID>(
93113
sourceModelName,
94114
sourceColumnName,
115+
)
116+
const targetColumnId = toPortID<TPortID>(
95117
targetModelName,
96118
targetColumnName,
97119
)
98-
const sourceColumnId = toPortID(sourceModelName, sourceColumnName)
99-
const targetColumnId = toPortID(targetModelName, targetColumnName)
100120

101121
edges.push(
102122
transformEdge(
@@ -121,19 +141,26 @@ export function getEdgesFromColumnLineage<
121141
return edges
122142
}
123143

124-
export function getConnectedColumnsIDs(
125-
adjacencyList: ColumnLevelLineageAdjacencyList,
144+
export function getConnectedColumnsIDs<
145+
TAdjacencyListKey extends string,
146+
TAdjacencyListColumnKey extends string,
147+
TColumnID extends string = PortId,
148+
>(
149+
adjacencyList: ColumnLevelLineageAdjacencyList<
150+
TAdjacencyListKey,
151+
TAdjacencyListColumnKey
152+
>,
126153
) {
127-
const connectedColumns = new Set<PortId>()
154+
const connectedColumns = new Set<TColumnID>()
128155
const targets = Object.entries(adjacencyList) as [
129-
AdjacencyListKey,
130-
ColumnLevelConnections,
156+
TAdjacencyListKey,
157+
ColumnLevelConnections<TAdjacencyListKey, TAdjacencyListColumnKey>,
131158
][]
132159

133160
for (const [sourceModelName, targetColumns] of targets) {
134161
const targetConnections = Object.entries(targetColumns) as [
135-
AdjacencyListColumnKey,
136-
ColumnLevelDetails,
162+
TAdjacencyListColumnKey,
163+
ColumnLevelDetails<TAdjacencyListKey, TAdjacencyListColumnKey>,
137164
][]
138165

139166
for (const [
@@ -143,8 +170,8 @@ export function getConnectedColumnsIDs(
143170
connectedColumns.add(toPortID(sourceModelName, sourceColumnName))
144171

145172
const sources = Object.entries(sourceModels) as [
146-
AdjacencyListKey,
147-
AdjacencyListKey[],
173+
TAdjacencyListKey,
174+
TAdjacencyListColumnKey[],
148175
][]
149176

150177
for (const [targetModelName, sourceColumns] of sources) {

0 commit comments

Comments
 (0)