65 lines
1.8 KiB
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
|
|
}
|