@@ -50,6 +50,14 @@ import {
5050 LimitAndOffsetNodeState ,
5151} from './query_builder/nodes/limit_and_offset_node' ;
5252import { SortNode , SortNodeState } from './query_builder/nodes/sort_node' ;
53+ import {
54+ MergeNode ,
55+ MergeSerializedState ,
56+ } from './query_builder/nodes/merge_node' ;
57+ import {
58+ UnionNode ,
59+ UnionSerializedState ,
60+ } from './query_builder/nodes/union_node' ;
5361
5462type SerializedNodeState =
5563 | TableSourceSerializedState
@@ -60,7 +68,9 @@ type SerializedNodeState =
6068 | IntervalIntersectSerializedState
6169 | AddColumnsNodeState
6270 | LimitAndOffsetNodeState
63- | SortNodeState ;
71+ | SortNodeState
72+ | MergeSerializedState
73+ | UnionSerializedState ;
6474
6575// Interfaces for the serialized JSON structure
6676export interface SerializedNode {
@@ -201,6 +211,28 @@ function createNodeInstance(
201211 allNodes : [ ] ,
202212 } ;
203213 return new IntervalIntersectNode ( nodeState ) ;
214+ case NodeType . kMerge :
215+ const mergeState = state as MergeSerializedState ;
216+ return new MergeNode ( {
217+ prevNodes : [ ] ,
218+ leftQueryAlias : mergeState . leftQueryAlias ,
219+ rightQueryAlias : mergeState . rightQueryAlias ,
220+ conditionType : mergeState . conditionType ,
221+ leftColumn : mergeState . leftColumn ?? '' ,
222+ rightColumn : mergeState . rightColumn ?? '' ,
223+ sqlExpression : mergeState . sqlExpression ?? '' ,
224+ filters : mergeState . filters ,
225+ comment : mergeState . comment ,
226+ } ) ;
227+ case NodeType . kUnion :
228+ const unionState = state as UnionSerializedState ;
229+ const unionNode = new UnionNode ( {
230+ prevNodes : [ ] ,
231+ selectedColumns : unionState . selectedColumns ,
232+ } ) ;
233+ unionNode . filters = unionState . filters ;
234+ unionNode . comment = unionState . comment ;
235+ return unionNode ;
204236 default :
205237 throw new Error ( `Unknown node type: ${ serializedNode . type } ` ) ;
206238 }
@@ -304,6 +336,29 @@ export function deserializeState(
304336 intervalNode . prevNodes . push ( ...deserializedState . prevNodes ) ;
305337 }
306338 }
339+ if ( serializedNode . type === NodeType . kMerge ) {
340+ const mergeNode = node as MergeNode ;
341+ if ( mergeNode . prevNodes . length > 0 ) {
342+ const deserializedState = MergeNode . deserializeState (
343+ nodes ,
344+ serializedNode . state as MergeSerializedState ,
345+ ) ;
346+ mergeNode . prevNodes . length = 0 ;
347+ mergeNode . prevNodes . push ( ...deserializedState . prevNodes ) ;
348+ }
349+ }
350+ if ( serializedNode . type === NodeType . kUnion ) {
351+ const unionNode = node as UnionNode ;
352+ if ( unionNode . prevNodes . length > 0 ) {
353+ const deserializedState = UnionNode . deserializeState (
354+ nodes ,
355+ serializedNode . state as UnionSerializedState ,
356+ unionNode . prevNodes [ 0 ] ,
357+ ) ;
358+ unionNode . prevNodes . length = 0 ;
359+ unionNode . prevNodes . push ( ...deserializedState . prevNodes ) ;
360+ }
361+ }
307362 }
308363
309364 // Third pass: resolve columns
0 commit comments