Skip to content

Commit ab67ed6

Browse files
perf(registry): O(1) HasToolset lookup via pre-computed set
Add toolsetIDSet (map[ToolsetID]bool) to Registry for O(1) HasToolset lookups. Previously HasToolset iterated through all tools, resourceTemplates, and prompts to check if any belonged to the given toolset. Now it's a simple map lookup. The set is populated during the single-pass processToolsets() call, which already collected all valid toolset IDs. This adds zero new iteration - just returns the existing validIDs map. processToolsets now returns 6 values: - enabledToolsets, unrecognized, toolsetIDs, toolsetIDSet, defaultToolsetIDs, descriptions
1 parent 80fd086 commit ab67ed6

File tree

2 files changed

+8
-21
lines changed

2 files changed

+8
-21
lines changed

pkg/registry/builder.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func (b *Builder) Build() *Registry {
128128
// Note: toolsByName map is lazy-initialized on first use via getToolsByName()
129129

130130
// Process toolsets and pre-compute metadata in a single pass
131-
r.enabledToolsets, r.unrecognizedToolsets, r.toolsetIDs, r.defaultToolsetIDs, r.toolsetDescriptions = b.processToolsets()
131+
r.enabledToolsets, r.unrecognizedToolsets, r.toolsetIDs, r.toolsetIDSet, r.defaultToolsetIDs, r.toolsetDescriptions = b.processToolsets()
132132

133133
// Process additional tools (resolve aliases)
134134
if len(b.additionalTools) > 0 {
@@ -150,9 +150,10 @@ func (b *Builder) Build() *Registry {
150150
// - enabledToolsets map (nil means all enabled)
151151
// - unrecognizedToolsets list for warnings
152152
// - allToolsetIDs sorted list of all toolset IDs
153+
// - toolsetIDSet map for O(1) HasToolset lookup
153154
// - defaultToolsetIDs sorted list of default toolset IDs
154155
// - toolsetDescriptions map of toolset ID to description
155-
func (b *Builder) processToolsets() (map[ToolsetID]bool, []string, []ToolsetID, []ToolsetID, map[ToolsetID]string) {
156+
func (b *Builder) processToolsets() (map[ToolsetID]bool, []string, []ToolsetID, map[ToolsetID]bool, []ToolsetID, map[ToolsetID]string) {
156157
// Single pass: collect all toolset metadata together
157158
validIDs := make(map[ToolsetID]bool)
158159
defaultIDs := make(map[ToolsetID]bool)
@@ -207,7 +208,7 @@ func (b *Builder) processToolsets() (map[ToolsetID]bool, []string, []ToolsetID,
207208
// Check for "all" keyword - enables all toolsets
208209
for _, id := range toolsetIDs {
209210
if strings.TrimSpace(id) == "all" {
210-
return nil, nil, allToolsetIDs, defaultToolsetIDList, descriptions // nil means all enabled
211+
return nil, nil, allToolsetIDs, validIDs, defaultToolsetIDList, descriptions // nil means all enabled
211212
}
212213
}
213214

@@ -247,12 +248,12 @@ func (b *Builder) processToolsets() (map[ToolsetID]bool, []string, []ToolsetID,
247248
}
248249

249250
if len(expanded) == 0 {
250-
return make(map[ToolsetID]bool), unrecognized, allToolsetIDs, defaultToolsetIDList, descriptions
251+
return make(map[ToolsetID]bool), unrecognized, allToolsetIDs, validIDs, defaultToolsetIDList, descriptions
251252
}
252253

253254
enabledToolsets := make(map[ToolsetID]bool, len(expanded))
254255
for _, id := range expanded {
255256
enabledToolsets[id] = true
256257
}
257-
return enabledToolsets, unrecognized, allToolsetIDs, defaultToolsetIDList, descriptions
258+
return enabledToolsets, unrecognized, allToolsetIDs, validIDs, defaultToolsetIDList, descriptions
258259
}

pkg/registry/registry.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type Registry struct {
4141

4242
// Pre-computed toolset metadata (set during Build)
4343
toolsetIDs []ToolsetID // sorted list of all toolset IDs
44+
toolsetIDSet map[ToolsetID]bool // set for O(1) HasToolset lookup
4445
defaultToolsetIDs []ToolsetID // sorted list of default toolset IDs
4546
toolsetDescriptions map[ToolsetID]string // toolset ID -> description
4647

@@ -244,22 +245,7 @@ func (r *Registry) FindToolByName(toolName string) (*ServerTool, ToolsetID, erro
244245

245246
// HasToolset checks if any tool/resource/prompt belongs to the given toolset.
246247
func (r *Registry) HasToolset(toolsetID ToolsetID) bool {
247-
for i := range r.tools {
248-
if r.tools[i].Toolset.ID == toolsetID {
249-
return true
250-
}
251-
}
252-
for i := range r.resourceTemplates {
253-
if r.resourceTemplates[i].Toolset.ID == toolsetID {
254-
return true
255-
}
256-
}
257-
for i := range r.prompts {
258-
if r.prompts[i].Toolset.ID == toolsetID {
259-
return true
260-
}
261-
}
262-
return false
248+
return r.toolsetIDSet[toolsetID]
263249
}
264250

265251
// AllTools returns all tools without any filtering, sorted deterministically.

0 commit comments

Comments
 (0)