diff --git a/workspace.go b/workspace.go index 2f8753d..222a933 100644 --- a/workspace.go +++ b/workspace.go @@ -21,6 +21,14 @@ const createWorkspaceEntriesTableSQL = `CREATE TABLE IF NOT EXISTS workspace_ent created_at INTEGER NOT NULL )` +const createWorkspaceEntriesViewSQL = `CREATE VIEW IF NOT EXISTS entries AS +SELECT + entry_id AS id, + entry_kind AS kind, + entry_data AS data, + created_at +FROM workspace_entries` + var defaultWorkspaceStateDirectory = ".core/state" // Workspace accumulates mutable work-in-progress entries before they are @@ -307,6 +315,10 @@ func openWorkspaceDatabase(databasePath string) (*sql.DB, error) { workspaceDatabase.Close() return nil, err } + if _, err := workspaceDatabase.Exec(createWorkspaceEntriesViewSQL); err != nil { + workspaceDatabase.Close() + return nil, err + } return workspaceDatabase, nil } diff --git a/workspace_test.go b/workspace_test.go index 214afe8..09d259b 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -39,6 +39,32 @@ func TestWorkspace_NewWorkspace_Good_CreatePutAggregateQuery(t *testing.T) { assert.Equal(t, int64(1), rows[1]["entry_count"]) } +func TestWorkspace_Query_Good_RFCEntriesView(t *testing.T) { + useWorkspaceStateDirectory(t) + + storeInstance, err := New(":memory:") + require.NoError(t, err) + defer storeInstance.Close() + + workspace, err := storeInstance.NewWorkspace("scroll-session") + require.NoError(t, err) + defer workspace.Discard() + + require.NoError(t, workspace.Put("like", map[string]any{"user": "@alice"})) + require.NoError(t, workspace.Put("like", map[string]any{"user": "@bob"})) + require.NoError(t, workspace.Put("profile_match", map[string]any{"user": "@charlie"})) + + rows := requireResultRows( + t, + workspace.Query("SELECT kind, COUNT(*) AS entry_count FROM entries GROUP BY kind ORDER BY kind"), + ) + require.Len(t, rows, 2) + assert.Equal(t, "like", rows[0]["kind"]) + assert.Equal(t, int64(2), rows[0]["entry_count"]) + assert.Equal(t, "profile_match", rows[1]["kind"]) + assert.Equal(t, int64(1), rows[1]["entry_count"]) +} + func TestWorkspace_Commit_Good_JournalAndSummary(t *testing.T) { useWorkspaceStateDirectory(t)