diff --git a/spark-ui/src/components/SqlFlow/node-style.module.css b/spark-ui/src/components/SqlFlow/flowComponents/StageNode/node-style.module.css
similarity index 100%
rename from spark-ui/src/components/SqlFlow/node-style.module.css
rename to spark-ui/src/components/SqlFlow/flowComponents/StageNode/node-style.module.css
diff --git a/spark-ui/src/interfaces/AppStore.ts b/spark-ui/src/interfaces/AppStore.ts
index 20e5248..56bac5d 100644
--- a/spark-ui/src/interfaces/AppStore.ts
+++ b/spark-ui/src/interfaces/AppStore.ts
@@ -274,6 +274,7 @@ export interface EnrichedSqlNode {
export interface SQLNodeExchangeStageData {
type: "exchange";
+ stageId: number;
writeStage: number;
readStage: number;
status: string;
diff --git a/spark-ui/src/reducers/SQLNodeStageReducer.ts b/spark-ui/src/reducers/SQLNodeStageReducer.ts
index f816080..d91be0b 100644
--- a/spark-ui/src/reducers/SQLNodeStageReducer.ts
+++ b/spark-ui/src/reducers/SQLNodeStageReducer.ts
@@ -63,6 +63,7 @@ export function calculateSQLNodeStage(sql: EnrichedSparkSQL): EnrichedSparkSQL {
...node,
stage: {
type: "exchange",
+ stageId: node.nodeId,
writeStage:
previousNode.stage?.type === "onestage"
? previousNode.stage.stageId
diff --git a/spark-ui/src/tabs/SummaryTab.tsx b/spark-ui/src/tabs/SummaryTab.tsx
index 67e5717..30bdeac 100644
--- a/spark-ui/src/tabs/SummaryTab.tsx
+++ b/spark-ui/src/tabs/SummaryTab.tsx
@@ -1,7 +1,7 @@
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import BuildIcon from "@mui/icons-material/Build";
import { Box, Fade, IconButton, Tooltip, Typography } from "@mui/material";
-import * as React from "react";
+import React, { useEffect, useMemo, useState } from "react";
import SqlFlow from "../components/SqlFlow/SqlFlow";
import SqlTable from "../components/SqlTable/SqlTable";
import SummaryBar from "../components/SummaryBar";
@@ -13,19 +13,20 @@ import { getBaseAppUrl } from "../utils/UrlUtils";
export default function SummaryTab() {
const sql = useAppSelector((state) => state.spark.sql);
- const [selectedSqlId, setSelectedSqlId] = React.useState(
+ const [selectedSqlId, setSelectedSqlId] = useState(
undefined,
);
- const selectedSql =
- selectedSqlId === undefined
- ? undefined
- : sql?.sqls.find((sql) => sql.id === selectedSqlId);
- React.useEffect(() => {
+ const selectedSql = useMemo(
+ () => sql?.sqls.find((sql) => sql.id === selectedSqlId),
+ [selectedSqlId],
+ );
+
+ useEffect(() => {
MixpanelService.TrackPageView();
}, []);
- React.useEffect(() => {
+ useEffect(() => {
function handleEscapeKey(event: KeyboardEvent) {
if (event.code === "Escape") {
setSelectedSqlId(undefined);