Skip to content

Commit 71e4f78

Browse files
authored
exp: Make sure everything is serializable (#3499)
Making sure that all of the existing nodes are properly serializable
1 parent f9066ec commit 71e4f78

File tree

2 files changed

+657
-1
lines changed

2 files changed

+657
-1
lines changed

ui/src/plugins/dev.perfetto.ExplorePage/json_handler.ts

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ import {
5050
LimitAndOffsetNodeState,
5151
} from './query_builder/nodes/limit_and_offset_node';
5252
import {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

5462
type 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
6676
export 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

Comments
 (0)