From 5587e301bd091a7fc2e7a19afc2c43c446d50a36 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 14:15:53 +0000 Subject: [PATCH] refactor(store): copy journal result maps Co-Authored-By: Virgil --- journal.go | 26 ++++++++++++++++++++++++-- journal_test.go | 26 ++++++++++++++++++++++++++ workspace.go | 2 +- workspace_test.go | 23 +++++++++++++++++++++++ 4 files changed, 74 insertions(+), 3 deletions(-) diff --git a/journal.go b/journal.go index 86d8371..260ade3 100644 --- a/journal.go +++ b/journal.go @@ -89,8 +89,8 @@ func (storeInstance *Store) CommitToJournal(measurement string, fields map[strin Value: map[string]any{ "bucket": storeInstance.journalBucket(), "measurement": measurement, - "fields": fields, - "tags": tags, + "fields": cloneAnyMap(fields), + "tags": cloneStringMap(tags), "committed_at": committedAt, }, OK: true, @@ -429,3 +429,25 @@ func normaliseRowValue(value any) any { return typedValue } } + +func cloneAnyMap(input map[string]any) map[string]any { + if input == nil { + return map[string]any{} + } + cloned := make(map[string]any, len(input)) + for key, value := range input { + cloned[key] = value + } + return cloned +} + +func cloneStringMap(input map[string]string) map[string]string { + if input == nil { + return map[string]string{} + } + cloned := make(map[string]string, len(input)) + for key, value := range input { + cloned[key] = value + } + return cloned +} diff --git a/journal_test.go b/journal_test.go index 22fdea2..1bdcb05 100644 --- a/journal_test.go +++ b/journal_test.go @@ -35,6 +35,32 @@ func TestJournal_CommitToJournal_Good_WithQueryJournalSQL(t *testing.T) { assert.Equal(t, "session-b", tags["workspace"]) } +func TestJournal_CommitToJournal_Good_ResultCopiesInputMaps(t *testing.T) { + storeInstance, err := New(":memory:", WithJournal("http://127.0.0.1:8086", "core", "events")) + require.NoError(t, err) + defer storeInstance.Close() + + fields := map[string]any{"like": 4} + tags := map[string]string{"workspace": "session-a"} + + result := storeInstance.CommitToJournal("session-a", fields, tags) + require.True(t, result.OK, "journal commit failed: %v", result.Value) + + fields["like"] = 99 + tags["workspace"] = "session-b" + + value, ok := result.Value.(map[string]any) + require.True(t, ok, "unexpected result type: %T", result.Value) + + resultFields, ok := value["fields"].(map[string]any) + require.True(t, ok, "unexpected fields type: %T", value["fields"]) + assert.Equal(t, 4, resultFields["like"]) + + resultTags, ok := value["tags"].(map[string]string) + require.True(t, ok, "unexpected tags type: %T", value["tags"]) + assert.Equal(t, "session-a", resultTags["workspace"]) +} + func TestJournal_QueryJournal_Good_RawSQLWithCTE(t *testing.T) { storeInstance, err := New(":memory:", WithJournal("http://127.0.0.1:8086", "core", "events")) require.NoError(t, err) diff --git a/workspace.go b/workspace.go index f868033..3cc80ae 100644 --- a/workspace.go +++ b/workspace.go @@ -306,7 +306,7 @@ func (workspace *Workspace) Commit() core.Result { if err := workspace.closeAndRemoveFiles(); err != nil { return core.Result{Value: err, OK: false} } - return core.Result{Value: fields, OK: true} + return core.Result{Value: cloneAnyMap(fields), OK: true} } // Usage example: `workspace.Discard()` diff --git a/workspace_test.go b/workspace_test.go index b1edc27..4914772 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -125,6 +125,29 @@ func TestWorkspace_Commit_Good_JournalAndSummary(t *testing.T) { assert.Equal(t, "scroll-session", tags["workspace"]) } +func TestWorkspace_Commit_Good_ResultCopiesAggregatedMap(t *testing.T) { + useWorkspaceStateDirectory(t) + + storeInstance, err := New(":memory:", WithJournal("http://127.0.0.1:8086", "core", "events")) + require.NoError(t, err) + defer storeInstance.Close() + + workspace, err := storeInstance.NewWorkspace("scroll-session") + require.NoError(t, err) + + aggregateSource := map[string]any{"like": 1} + require.NoError(t, workspace.Put("like", aggregateSource)) + + result := workspace.Commit() + require.True(t, result.OK, "workspace commit failed: %v", result.Value) + + aggregateSource["like"] = 99 + + value, ok := result.Value.(map[string]any) + require.True(t, ok, "unexpected result type: %T", result.Value) + assert.Equal(t, 1, value["like"]) +} + func TestWorkspace_Commit_Good_EmitsSummaryEvent(t *testing.T) { useWorkspaceStateDirectory(t) -- 2.45.3