func()

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
}