Skip to content

Commit 2f98629

Browse files
authored
feat(vscode): add basic column lineage (#4476)
1 parent 6b46eed commit 2f98629

3 files changed

Lines changed: 40 additions & 23 deletions

File tree

vscode/react/src/components/graph/ModelNode.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ export default function ModelNode({
2828
data,
2929
sourcePosition,
3030
targetPosition,
31-
}: NodeProps): JSX.Element {
32-
const nodeData: GraphNodeData = data ?? {}
31+
}: NodeProps<GraphNodeData>): JSX.Element {
32+
const nodeData: GraphNodeData = data ?? {
33+
label: '',
34+
type: EnumLineageNodeModelType.unknown,
35+
withColumns: false,
36+
}
3337
const {
3438
// connections,
3539
models,
@@ -128,11 +132,18 @@ export default function ModelNode({
128132
const isMainNode = mainNode === id
129133
const isHighlightedNode = highlightedNodeModels.includes(id)
130134
const isSelected = selectedNodes.has(id)
131-
const isModelSQL = nodeData.type === EnumLineageNodeModelType.sql
132-
const isCTE = nodeData.type === EnumLineageNodeModelType.cte
133-
const isModelExternal = nodeData.type === EnumLineageNodeModelType.external
134-
const isModelSeed = nodeData.type === EnumLineageNodeModelType.seed
135-
const isModelUnknown = nodeData.type === EnumLineageNodeModelType.unknown
135+
// Ensure nodeData.type is a valid LineageNodeModelType
136+
const nodeType: LineageNodeModelType = Object.values(
137+
EnumLineageNodeModelType,
138+
).includes(nodeData.type as any)
139+
? (nodeData.type as LineageNodeModelType)
140+
: EnumLineageNodeModelType.unknown
141+
142+
const isModelSQL = nodeType === EnumLineageNodeModelType.sql
143+
const isCTE = nodeType === EnumLineageNodeModelType.cte
144+
const isModelExternal = nodeType === EnumLineageNodeModelType.external
145+
const isModelSeed = nodeType === EnumLineageNodeModelType.seed
146+
const isModelUnknown = nodeType === EnumLineageNodeModelType.unknown
136147
const showColumns = isArrayNotEmpty(columns) && isFalse(hasHighlightedNodes)
137148
const isActiveNode =
138149
selectedNodes.size > 0 || activeNodes.size > 0 || withConnected
@@ -188,7 +199,7 @@ export default function ModelNode({
188199
>
189200
<ModelNodeHeaderHandles
190201
id={id}
191-
// type={nodeData.type}
202+
type={nodeType}
192203
label={nodeData.label}
193204
isSelected={isSelected}
194205
isDraggable={true}

vscode/react/src/components/graph/help.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export interface GraphNodeData {
2222
label: string
2323
type: LineageNodeModelType
2424
withColumns: boolean
25+
width?: number
26+
height?: number
2527
[key: string]: any
2628
}
2729

@@ -170,20 +172,25 @@ function getNodeMap({
170172
const modelNames = Object.keys(lineage)
171173

172174
return modelNames.reduce((acc: Record<string, Node>, modelName: string) => {
173-
const model = models[modelName]
175+
const decodedModelName = modelName.includes('%')
176+
? decodeURI(modelName)
177+
: modelName
178+
const model = Object.values(models).find(m => m.fqn === decodedModelName)
179+
console.log('model', model)
180+
const nodeType: LineageNodeModelType = isNotNil(model)
181+
? (model.type as LineageNodeModelType)
182+
: // If model name present in lineage but not in global models
183+
// it means either this is a CTE or model is UNKNOWN
184+
// CTEs only have connections between columns
185+
// where UNKNOWN model has connection only from another model
186+
unknownModels.has(modelName)
187+
? EnumLineageNodeModelType.unknown
188+
: EnumLineageNodeModelType.cte
189+
174190
const node = createGraphNode(modelName, {
175-
// @ts-ignore
176-
label: model?.displayName ?? modelName,
191+
label: model?.name ?? modelName,
177192
withColumns,
178-
type: isNotNil(model)
179-
? (model.type as LineageNodeModelType)
180-
: // If model name present in lineage but not in global models
181-
// it means either this is a CTE or model is UNKNOWN
182-
// CTEs only have connections between columns
183-
// where UNKNOWN model has connection only from another model
184-
unknownModels.has(modelName)
185-
? EnumLineageNodeModelType.unknown
186-
: EnumLineageNodeModelType.cte,
193+
type: nodeType,
187194
})
188195
const columnsCount = withColumns
189196
? (models[modelName]?.columns?.length ?? 0)
@@ -267,7 +274,7 @@ function createGraphNode(
267274
data: GraphNodeData,
268275
position: XYPosition = { x: 0, y: 0 },
269276
hidden: boolean = false,
270-
): Node {
277+
): Node<GraphNodeData> {
271278
return {
272279
id,
273280
dragHandle: '.drag-handle',

vscode/react/src/domain/sqlmesh-model.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import {
1010
} from '@/api/client'
1111
import { isArrayNotEmpty } from '@/utils/index'
1212
import { ModelInitial } from './initial'
13-
14-
type Lineage = any
13+
import type { Lineage } from './lineage'
1514

1615
export interface InitialSQLMeshModel extends Model {
1716
lineage?: Record<string, Lineage>

0 commit comments

Comments
 (0)