l_ai_knowledge/internal/application/service/retriever/registry.go

65 lines
1.8 KiB
Go

package retriever
import (
"fmt"
"sync"
"knowlege-lsxd/internal/types"
"knowlege-lsxd/internal/types/interfaces"
)
// RetrieveEngineRegistry implements the retrieval engine registry
type RetrieveEngineRegistry struct {
repositories map[types.RetrieverEngineType]interfaces.RetrieveEngineService
mu sync.RWMutex
}
// NewRetrieveEngineRegistry creates a new retrieval engine registry
func NewRetrieveEngineRegistry() interfaces.RetrieveEngineRegistry {
return &RetrieveEngineRegistry{
repositories: make(map[types.RetrieverEngineType]interfaces.RetrieveEngineService),
}
}
// Register registers a retrieval engine service
func (r *RetrieveEngineRegistry) Register(repo interfaces.RetrieveEngineService) error {
r.mu.Lock()
defer r.mu.Unlock()
if _, exists := r.repositories[repo.EngineType()]; exists {
return fmt.Errorf("Repository type %s already registered", repo.EngineType())
}
r.repositories[repo.EngineType()] = repo
return nil
}
// GetRetrieveEngineService retrieves a retrieval engine service by type
func (r *RetrieveEngineRegistry) GetRetrieveEngineService(repoType types.RetrieverEngineType) (
interfaces.RetrieveEngineService, error,
) {
r.mu.RLock()
defer r.mu.RUnlock()
repo, exists := r.repositories[repoType]
if !exists {
return nil, fmt.Errorf("Repository of type %s not found", repoType)
}
return repo, nil
}
// GetAllRetrieveEngineServices retrieves all registered retrieval engine services
func (r *RetrieveEngineRegistry) GetAllRetrieveEngineServices() []interfaces.RetrieveEngineService {
r.mu.RLock()
defer r.mu.RUnlock()
// Create a copy to avoid modifying the original map
result := make([]interfaces.RetrieveEngineService, 0, len(r.repositories))
for _, v := range r.repositories {
result = append(result, v)
}
return result
}