in banyand/metadata/schema/property.go [88:134]
func (e *etcdSchemaRegistry) ApplyProperty(ctx context.Context, property *propertyv1.Property, strategy propertyv1.ApplyRequest_Strategy) (bool, uint32, error) {
m := transformKey(property.GetMetadata())
group := m.GetGroup()
if _, getGroupErr := e.GetGroup(ctx, group); getGroupErr != nil {
return false, 0, errors.Wrap(getGroupErr, "group is not exist")
}
if property.UpdatedAt != nil {
property.UpdatedAt = timestamppb.Now()
}
md := Metadata{
TypeMeta: TypeMeta{
Kind: KindProperty,
Group: group,
Name: m.GetName(),
},
Spec: property,
}
tagsNum := uint32(len(property.Tags))
err := e.create(ctx, md)
if err == nil {
return true, tagsNum, nil
}
if !errors.Is(err, errGRPCAlreadyExists) {
return false, 0, err
}
if strategy != propertyv1.ApplyRequest_STRATEGY_REPLACE {
existed, errGet := e.GetProperty(ctx, property.Metadata, nil)
if errGet != nil {
return false, 0, errGet
}
for i := 0; i < int(tagsNum); i++ {
t := property.Tags[0]
property.Tags = property.Tags[1:]
for _, et := range existed.Tags {
if et.Key == t.Key {
et.Value = t.Value
}
}
}
existed.Tags = append(existed.Tags, property.Tags...)
md.Spec = existed
}
if err = e.update(ctx, md); err != nil {
return false, 0, err
}
return false, tagsNum, nil
}