Spaces:
Running
Running
File size: 4,203 Bytes
b110593 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package modules
import (
"context"
"github.com/pkg/errors"
"github.com/weaviate/weaviate/entities/models"
"github.com/weaviate/weaviate/entities/modulecapabilities"
"github.com/weaviate/weaviate/entities/schema"
)
// SetClassDefaults sets the module-specific defaults for the class itself, but
// also for each prop
func (p *Provider) SetClassDefaults(class *models.Class) {
if class.Vectorizer == "none" {
// the class does not use a vectorizer, nothing to do for us
return
}
mod := p.GetByName(class.Vectorizer)
cc, ok := mod.(modulecapabilities.ClassConfigurator)
if !ok {
// the module exists, but is not a class configurator, nothing to do for us
return
}
cfg := NewClassBasedModuleConfig(class, class.Vectorizer, "")
p.setPerClassConfigDefaults(class, cfg, cc)
p.setPerPropertyConfigDefaults(class, cfg, cc)
}
// SetSinglePropertyDefaults can be used when a property is added later, e.g.
// as part of merging in a ref prop after a class has already been created
func (p *Provider) SetSinglePropertyDefaults(class *models.Class,
prop *models.Property,
) {
if class.Vectorizer == "none" {
// the class does not use a vectorizer, nothing to do for us
return
}
mod := p.GetByName(class.Vectorizer)
cc, ok := mod.(modulecapabilities.ClassConfigurator)
if !ok {
// the module exists, but is not a class configurator, nothing to do for us
return
}
p.setSinglePropertyConfigDefaults(class, prop, cc)
}
func (p *Provider) setPerClassConfigDefaults(class *models.Class,
cfg *ClassBasedModuleConfig, cc modulecapabilities.ClassConfigurator,
) {
modDefaults := cc.ClassConfigDefaults()
userSpecified := cfg.Class()
mergedConfig := map[string]interface{}{}
for key, value := range modDefaults {
mergedConfig[key] = value
}
for key, value := range userSpecified {
mergedConfig[key] = value
}
if class.ModuleConfig == nil {
class.ModuleConfig = map[string]interface{}{}
}
class.ModuleConfig.(map[string]interface{})[class.Vectorizer] = mergedConfig
}
func (p *Provider) setPerPropertyConfigDefaults(class *models.Class,
cfg *ClassBasedModuleConfig, cc modulecapabilities.ClassConfigurator,
) {
for _, prop := range class.Properties {
p.setSinglePropertyConfigDefaults(class, prop, cc)
}
}
func (p *Provider) setSinglePropertyConfigDefaults(class *models.Class,
prop *models.Property, cc modulecapabilities.ClassConfigurator,
) {
dt, _ := schema.GetValueDataTypeFromString(prop.DataType[0])
modDefaults := cc.PropertyConfigDefaults(dt)
mergedConfig := map[string]interface{}{}
userSpecified := make(map[string]interface{})
if prop.ModuleConfig != nil {
userSpecified = prop.ModuleConfig.(map[string]interface{})[class.Vectorizer].(map[string]interface{})
}
for key, value := range modDefaults {
mergedConfig[key] = value
}
for key, value := range userSpecified {
mergedConfig[key] = value
}
if prop.ModuleConfig == nil {
prop.ModuleConfig = map[string]interface{}{}
}
prop.ModuleConfig.(map[string]interface{})[class.Vectorizer] = mergedConfig
}
func (p *Provider) ValidateClass(ctx context.Context, class *models.Class) error {
if class.Vectorizer == "none" {
// the class does not use a vectorizer, nothing to do for us
return nil
}
moduleConfig, ok := class.ModuleConfig.(map[string]interface{})
if !ok {
return nil
}
for key := range moduleConfig {
mod := p.GetByName(key)
cc, ok := mod.(modulecapabilities.ClassConfigurator)
if !ok {
// the module exists, but is not a class configurator, nothing to do for us
return nil
}
cfg := NewClassBasedModuleConfig(class, key, "")
err := cc.ValidateClass(ctx, class, cfg)
if err != nil {
return errors.Wrapf(err, "module '%s'", key)
}
}
return nil
}
|