Skip to content

Commit 9442938

Browse files
committed
fix major performance bug
1 parent a8c83fc commit 9442938

File tree

4 files changed

+192
-163
lines changed

4 files changed

+192
-163
lines changed

py-src/data_formulator/sse_routes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def event_stream() -> Generator[str, None, None]:
5353
# Send initial connection confirmation
5454
yield format_sse_message({
5555
"type": "notification",
56-
"text": "SSE connection established successfully",
56+
"text": "agent connection ready",
5757
"timestamp": time.time()
5858
})
5959

@@ -69,7 +69,7 @@ def event_stream() -> Generator[str, None, None]:
6969
if time.time() - last_heartbeat_time > 30:
7070
last_heartbeat_time = time.time()
7171
yield format_sse_message({
72-
"type": "notification",
72+
"type": "heartbeat",
7373
"text": "Heartbeat",
7474
"timestamp": time.time()
7575
})

src/app/dfSlice.tsx

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -475,14 +475,14 @@ export const dataFormulatorSlice = createSlice({
475475
updateChartType: (state, action: PayloadAction<{chartId: string, chartType: string}>) => {
476476
let chartId = action.payload.chartId;
477477
let chartType = action.payload.chartType;
478-
state.charts = state.charts.map(chart => {
479-
if (chart.id == chartId) {
480-
return adaptChart(chart, getChartTemplate(chartType) as ChartTemplate);
481-
} else {
482-
return chart
483-
}
484-
})
478+
479+
let chart = dfSelectors.getAllCharts(state).find(c => c.id == chartId);
480+
if (chart) {
481+
chart = adaptChart(chart, getChartTemplate(chartType) as ChartTemplate);
482+
dfSelectors.replaceChart(state, chart);
483+
}
485484
},
485+
486486
updateTableRef: (state, action: PayloadAction<{chartId: string, tableRef: string}>) => {
487487
let chartId = action.payload.chartId;
488488
let tableRef = action.payload.tableRef;
@@ -494,57 +494,25 @@ export const dataFormulatorSlice = createSlice({
494494
}
495495
})
496496
},
497-
replaceTable: (state, action: PayloadAction<{chartId: string, table: DictTable}>) => {
498-
let chartId = action.payload.chartId;
499-
let chart = state.charts.find(c => c.id == chartId) as Chart;
500-
let table = action.payload.table;
501-
let allCharts = dfSelectors.getAllCharts(state);
502-
let currentTableRef = getDataTable(chart, state.tables, allCharts, state.conceptShelfItems).id;
503-
state.charts = state.charts.map(c => {
504-
if (c.id == chartId) {
505-
return { ...c, tableRef: table.id }
506-
} else {
507-
return c
508-
}
509-
})
510-
511-
if (!state.charts.some(c => c.id != chartId && getDataTable(c, state.tables, allCharts, state.conceptShelfItems).id == currentTableRef)) {
512-
state.tables = [...state.tables.filter(t => t.id != currentTableRef), table];
513-
} else {
514-
state.tables = [...state.tables, table];
515-
}
516-
},
517-
updateChartEncodingMap: (state, action: PayloadAction<{chartId: string, encodingMap: EncodingMap}>) => {
518-
let chartId = action.payload.chartId;
519-
let encodingMap = action.payload.encodingMap;
520-
state.charts = state.charts.map(c => {
521-
if (c.id == chartId) {
522-
return { ...c, encodingMap: encodingMap }
523-
} else {
524-
return c
525-
}
526-
})
527-
},
528497
updateChartEncoding: (state, action: PayloadAction<{chartId: string, channel: Channel, encoding: EncodingItem}>) => {
529498
let chartId = action.payload.chartId;
530499
let channel = action.payload.channel;
531500
let encoding = action.payload.encoding;
532-
let chart = state.charts.find(chart => chart.id == chartId);
501+
let chart = dfSelectors.getAllCharts(state).find(c => c.id == chartId);
533502
if (chart) {
534-
//TODO: check this, finding reference and directly update??
535-
(state.charts.find(chart => chart.id == chartId) as Chart).encodingMap[channel] = encoding;
503+
chart.encodingMap[channel] = encoding;
536504
}
537505
},
538506
updateChartEncodingProp: (state, action: PayloadAction<{chartId: string, channel: Channel, prop: string, value: any}>) => {
539507
let chartId = action.payload.chartId;
540508
let channel = action.payload.channel;
541509
let prop = action.payload.prop;
542510
let value = action.payload.value;
543-
let chart = state.charts.find(chart => chart.id == chartId);
511+
let chart = dfSelectors.getAllCharts(state).find(c => c.id == chartId);
544512

545513
if (chart) {
546514
//TODO: check this, finding reference and directly update??
547-
let encoding = (state.charts.find(chart => chart.id == chartId) as Chart).encodingMap[channel];
515+
let encoding = chart.encodingMap[channel];
548516
if (prop == 'fieldID') {
549517
encoding.fieldID = value;
550518

@@ -571,7 +539,7 @@ export const dataFormulatorSlice = createSlice({
571539
let channel1 = action.payload.channel1;
572540
let channel2 = action.payload.channel2;
573541

574-
let chart = state.charts.find(chart => chart.id == chartId)
542+
let chart = dfSelectors.getAllCharts(state).find(c => c.id == chartId);
575543
if (chart) {
576544
let enc1 = chart.encodingMap[channel1];
577545
let enc2 = chart.encodingMap[channel2];
@@ -601,8 +569,9 @@ export const dataFormulatorSlice = createSlice({
601569
},
602570
deleteConceptItemByID: (state, action: PayloadAction<string>) => {
603571
let conceptID = action.payload;
572+
let allCharts = dfSelectors.getAllCharts(state);
604573
// remove concepts from encoding maps
605-
if (state.charts.some(chart => chart.saved
574+
if (allCharts.some(chart => chart.saved
606575
&& Object.entries(chart.encodingMap).some(([channel, encoding]) => encoding.fieldID && conceptID == encoding.fieldID))) {
607576
console.log("cannot delete!")
608577
} else {
@@ -620,7 +589,7 @@ export const dataFormulatorSlice = createSlice({
620589
}
621590
state.conceptShelfItems = state.conceptShelfItems.filter(f => f.id != conceptID);
622591

623-
for (let chart of state.charts) {
592+
for (let chart of allCharts) {
624593
for (let [channel, encoding] of Object.entries(chart.encodingMap)) {
625594
if (encoding.fieldID && conceptID == encoding.fieldID) {
626595
// clear the encoding
@@ -631,14 +600,15 @@ export const dataFormulatorSlice = createSlice({
631600
}
632601
},
633602
batchDeleteConceptItemByID: (state, action: PayloadAction<string[]>) => {
603+
let allCharts = dfSelectors.getAllCharts(state);
634604
for (let conceptID of action.payload) {
635605
// remove concepts from encoding maps
636-
if (state.charts.some(chart => chart.saved
606+
if (allCharts.some(chart => chart.saved
637607
&& Object.entries(chart.encodingMap).some(([channel, encoding]) => encoding.fieldID && conceptID == encoding.fieldID))) {
638608
console.log("cannot delete!")
639609
} else {
640610
state.conceptShelfItems = state.conceptShelfItems.filter(field => field.id != conceptID);
641-
for (let chart of state.charts) {
611+
for (let chart of allCharts) {
642612
for (let [channel, encoding] of Object.entries(chart.encodingMap)) {
643613
if (encoding.fieldID && conceptID == encoding.fieldID) {
644614
// clear the encoding
@@ -669,7 +639,7 @@ export const dataFormulatorSlice = createSlice({
669639
},
670640
clearUnReferencedCustomConcepts: (state) => {
671641
let fieldNamesFromTables = state.tables.map(t => t.names).flat();
672-
let fieldIdsReferredByCharts = state.charts.map(c => Object.values(c.encodingMap).map(enc => enc.fieldID).filter(fid => fid != undefined) as string[]).flat();
642+
let fieldIdsReferredByCharts = dfSelectors.getAllCharts(state).map(c => Object.values(c.encodingMap).map(enc => enc.fieldID).filter(fid => fid != undefined) as string[]).flat();
673643

674644
state.conceptShelfItems = state.conceptShelfItems.filter(field => !(field.source == "custom"
675645
&& !(fieldNamesFromTables.includes(field.name) || fieldIdsReferredByCharts.includes(field.id))))
@@ -820,6 +790,19 @@ export const dfSelectors = {
820790
return [...userCharts, ...triggerCharts];
821791
}
822792
),
793+
794+
replaceChart: (state: DataFormulatorState, chart: Chart) => {
795+
if (state.charts.find(c => c.id == chart.id)) {
796+
// chart is from charts
797+
state.charts = state.charts.map(c => c.id == chart.id ? chart : c);
798+
} else {
799+
// chart is from tables
800+
let table = state.tables.find(t => t.derive?.trigger?.chart?.id == chart.id) as DictTable;
801+
if (table.derive?.trigger) {
802+
table.derive = { ...table.derive, trigger: { ...table.derive?.trigger, chart: chart } };
803+
}
804+
}
805+
},
823806
}
824807

825808
// derived field: extra all field items from the table

0 commit comments

Comments
 (0)