recconf/requirements.go (164 lines of code) (raw):
package recconf
import (
"fmt"
)
type Dependent interface {
Requirements() Requirements
}
type Constraint func(module any) error
type Requirements map[ModuleIndex][]Constraint
func (r Requirements) Add(modType string, modName string, constraints ...Constraint) {
index := ModuleIndex{
Type: modType,
Name: modName,
}
r[index] = append(r[index], constraints...)
}
func (r Requirements) Check(modules map[ModuleIndex]any) error {
for requireModuleIndex, constraints := range r {
jsonPath := modJsonPath[requireModuleIndex.Type]
if requireModule, ok := modules[requireModuleIndex]; !ok {
if jsonPath != "" {
return fmt.Errorf("%s (%s name) is not defined in %s", requireModuleIndex.Name, requireModuleIndex.Type, jsonPath)
}
return fmt.Errorf("%s (%s name) is undefined", requireModuleIndex.Name, requireModuleIndex.Type)
} else {
for _, constraint := range constraints {
if err := constraint(requireModule); err != nil {
if jsonPath != "" {
return fmt.Errorf("%s (%s name in %s) does not satisfy the requirement, details: %s",
requireModuleIndex.Name, requireModuleIndex.Type, jsonPath, err.Error())
}
return fmt.Errorf("%s (%s name) does not satisfy the requirement, details: %s",
requireModuleIndex.Name, requireModuleIndex.Type, err.Error())
}
}
}
}
return nil
}
func newRequirements() Requirements {
return map[ModuleIndex][]Constraint{}
}
func (conf RecallConfig) Requirements() Requirements {
requirements := newRequirements()
addDaoRequirements(conf.DaoConf, requirements)
addDaoRequirements(conf.UserCollaborativeDaoConf.DaoConfig, requirements)
addDaoRequirements(conf.RealTimeUser2ItemDaoConf.UserTriggerDaoConf.SqlDaoConfig.DaoConfig, requirements)
addDaoRequirements(conf.VectorDaoConf.DaoConfig, requirements)
for _, featureConf := range conf.UserFeatureConfs {
addDaoRequirements(featureConf.FeatureDaoConf.DaoConfig, requirements)
}
if conf.GraphConf.GraphName != "" {
requirements.Add(GraphConfig{}.ModuleType(), conf.GraphConf.GraphName)
}
addDaoRequirements(conf.ColdStartDaoConf.DaoConfig, requirements)
addDaoRequirements(conf.ItemCollaborativeDaoConf.DaoConfig, requirements)
if conf.OpenSearchConf.OpenSearchName != "" {
requirements.Add(OpenSearchConfig{}.ModuleType(), conf.OpenSearchConf.OpenSearchName)
}
return requirements
}
func (conf FilterConfig) Requirements() Requirements {
requirements := newRequirements()
addDaoRequirements(conf.DaoConf, requirements)
return requirements
}
func (conf SortConfig) Requirements() Requirements {
requirements := newRequirements()
addDaoRequirements(conf.DPPConf.DaoConf, requirements)
addDaoRequirements(conf.SSDConf.DaoConf, requirements)
addDaoRequirements(conf.BoostScoreByWeightDao.DaoConfig, requirements)
return requirements
}
var builtInRecalls = map[string]bool{
"ContextItemRecall": true,
}
var builtInFilters = map[string]bool{
"UniqueFilter": true,
}
var builtInSort = map[string]bool{
"ItemRankScore": true,
}
func (conf SceneRecallConfig) Requirements() Requirements {
requirements := newRequirements()
for _, config := range conf {
for _, name := range config.RecallNames {
if builtInRecalls[name] {
continue
}
requirements.Add(RecallConfig{}.ModuleType(), name)
}
}
return requirements
}
func (conf SceneFilterConfig) Requirements() Requirements {
requirements := newRequirements()
for _, name := range conf {
if builtInFilters[name] {
continue
}
requirements.Add(FilterConfig{}.ModuleType(), name)
}
return requirements
}
func (conf GeneralRankConfig) Requirements() Requirements {
requirements := newRequirements()
for _, loadConf := range conf.FeatureLoadConfs {
addDaoRequirements(loadConf.FeatureDaoConf.DaoConfig, requirements)
}
for _, algoName := range conf.RankConf.RankAlgoList {
requirements.Add(AlgoConfig{}.ModuleType(), algoName)
}
return requirements
}
func (conf SceneFeatureConfig) Requirements() Requirements {
requirements := newRequirements()
for _, loadConf := range conf.FeatureLoadConfs {
addDaoRequirements(loadConf.FeatureDaoConf.DaoConfig, requirements)
}
return requirements
}
func (conf RankConfig) Requirements() Requirements {
requirements := newRequirements()
for _, algoName := range conf.RankAlgoList {
requirements.Add(AlgoConfig{}.ModuleType(), algoName)
}
return requirements
}
func (conf SceneSortConfig) Requirements() Requirements {
requirements := newRequirements()
for _, name := range conf {
if builtInSort[name] {
continue
}
requirements.Add(FilterConfig{}.ModuleType(), name)
}
return requirements
}
func addDaoRequirements(conf DaoConfig, requirements Requirements) {
switch conf.AdapterType {
case DaoConf_Adapter_Hologres:
requirements.Add(HologresConfig{}.ModuleType(), conf.HologresName)
case DaoConf_Adapter_TableStore:
requirements.Add(TableStoreConfig{}.ModuleType(), conf.TableStoreName)
case DaoConf_Adapter_Redis:
requirements.Add(RedisConfig{}.ModuleType(), conf.RedisName)
case DaoConf_Adapter_Mysql:
requirements.Add(MysqlConfig{}.ModuleType(), conf.MysqlName)
case DaoConf_Adapter_HBase:
requirements.Add(HBaseConfig{}.ModuleType(), conf.HBaseName)
case DataSource_Type_FeatureStore:
requirements.Add(FeatureStoreConfig{}.ModuleType(), conf.FeatureStoreName)
case DataSource_Type_BE:
requirements.Add(BEConfig{}.ModuleType(), conf.BeName)
case DataSource_Type_ClickHouse:
requirements.Add(ClickHouseConfig{}.ModuleType(), conf.ClickHouseName)
case DataSource_Type_Lindorm:
requirements.Add(LindormConfig{}.ModuleType(), conf.LindormName)
case Datasource_Type_Graph:
requirements.Add(GraphConfig{}.ModuleType(), conf.GraphName)
case DataSource_Type_HBase_Thrift:
requirements.Add(HBaseThriftConfig{}.ModuleType(), conf.HBaseName)
}
}