11import { useApiModelLineage , useApiModels } from '@/api/index'
22import { useEffect , useMemo , useRef , useState } from 'react'
3+ import { type ModelSQLMeshModel } from '@/domain/sqlmesh-model'
34import { type HighlightedNodes , useLineageFlow } from './context'
45import { ChevronDownIcon } from '@heroicons/react/24/solid'
56import ReactFlow , {
@@ -18,6 +19,7 @@ import ReactFlow, {
1819} from 'reactflow'
1920import Loading from '@/components/loading/Loading'
2021import Spinner from '@/components/logo/Spinner'
22+ import { createLineageWorker } from '@/workers'
2123import { isArrayEmpty , isFalse , isNil , isNotNil } from '@/utils/index'
2224import ListboxShow from '@/components/listbox/ListboxShow'
2325import clsx from 'clsx'
@@ -42,7 +44,7 @@ export function ModelLineage({
4244 model,
4345 highlightedNodes,
4446} : {
45- model : Model
47+ model : ModelSQLMeshModel
4648 highlightedNodes ?: HighlightedNodes
4749} ) : JSX . Element {
4850 const {
@@ -67,24 +69,32 @@ export function ModelLineage({
6769 isFetching : isFetchingModelLineage ,
6870 } = useApiModelLineage ( model . name )
6971 const { isFetching : isFetchingModels } = useApiModels ( )
70- const [ isMergingModels , setIsMergingModels ] = useState ( false )
72+
73+ const [ isMegringModels , setIsMergingModels ] = useState ( false )
7174 const [ modelLineage , setModelLineage ] =
7275 useState < ModelLineageApiLineageModelNameGet200 | undefined > ( undefined )
7376
74- console . log ( 'model to lineage' , model )
75- console . log ( 'modelLineage' , modelLineage )
76- console . log ( 'models' , models )
77- console . log ( 'isFetchingModelLineage' , isFetchingModelLineage )
77+ useEffect ( ( ) => {
78+ const lineageWorker = createLineageWorker ( )
7879
80+ lineageWorker . addEventListener ( 'message' , handleLineageWorkerMessage )
7981
80- useEffect ( ( ) => {
8182 getModelLineage ( )
8283 . then ( ( { data } ) => {
8384 setModelLineage ( data )
8485
8586 if ( isNil ( data ) ) return
8687
8788 setIsMergingModels ( true )
89+
90+ lineageWorker . postMessage ( {
91+ topic : 'lineage' ,
92+ payload : {
93+ currentLineage : { } ,
94+ newLineage : data ,
95+ mainNode : model . fqn ,
96+ } ,
97+ } )
8898 } )
8999 . catch ( error => {
90100 handleError ?.( error )
@@ -101,6 +111,9 @@ export function ModelLineage({
101111 return ( ) => {
102112 // void cancel?.()
103113
114+ lineageWorker . removeEventListener ( 'message' , handleLineageWorkerMessage )
115+ lineageWorker . terminate ( )
116+
104117 setLineage ( { } )
105118 setNodeConnections ( { } )
106119 setMainNode ( undefined )
@@ -113,10 +126,10 @@ export function ModelLineage({
113126 modelName = encodeURI ( modelName )
114127
115128 if (
116- ! models [ modelName ] &&
117- ! unknownModels [ modelName ]
129+ isFalse ( modelName in models ) &&
130+ isFalse ( modelName in unknownModels )
118131 ) {
119- unknownModels [ modelName ]
132+ unknownModels . add ( modelName )
120133 }
121134 } )
122135
@@ -127,13 +140,27 @@ export function ModelLineage({
127140 setHighlightedNodes ( highlightedNodes ?? { } )
128141 } , [ highlightedNodes ] )
129142
130- const isFetching =
131- isFetchingModelLineage || isFetchingModels || isMergingModels
132- console . log ( 'isFetchingModelLineage' , isFetchingModelLineage )
133- console . log ( 'isFetchingModels' , isFetchingModels )
134- console . log ( 'isMegringModels' , isMergingModels )
135- console . log ( 'isFetching' , isFetching )
143+ function handleLineageWorkerMessage ( e : MessageEvent ) : void {
144+ if ( e . data . topic === 'lineage' ) {
145+ setIsMergingModels ( false )
146+ setNodeConnections ( e . data . payload . nodesConnections )
147+ setLineage ( e . data . payload . lineage )
136148
149+ if (
150+ Object . values ( e . data . payload ?. lineage ?? { } ) . length > WITH_COLUMNS_LIMIT
151+ ) {
152+ setWithColumns ( false )
153+ }
154+ }
155+
156+ if ( e . data . topic === 'error' ) {
157+ handleError ?.( e . data . error )
158+ setIsMergingModels ( false )
159+ }
160+ }
161+
162+ const isFetching =
163+ isFetchingModelLineage || isFetchingModels || isMegringModels
137164
138165 return (
139166 < div className = "relative h-full w-full overflow-hidden" >
0 commit comments