Spaces:
Running
Running
File size: 2,959 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 |
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package objects
import (
"context"
"fmt"
"github.com/go-openapi/strfmt"
"github.com/weaviate/weaviate/entities/additional"
"github.com/weaviate/weaviate/entities/models"
)
// DeleteObject Class Instance from the connected DB
//
// if class == "" it will delete all object with same id regardless of the class name.
// This is due to backward compatibility reasons and should be removed in the future
func (m *Manager) DeleteObject(ctx context.Context,
principal *models.Principal, class string, id strfmt.UUID,
repl *additional.ReplicationProperties, tenant string,
) error {
path := fmt.Sprintf("objects/%s/%s", class, id)
if class == "" {
path = fmt.Sprintf("objects/%s", id)
}
err := m.authorizer.Authorize(principal, "delete", path)
if err != nil {
return err
}
unlock, err := m.locks.LockConnector()
if err != nil {
return NewErrInternal("could not acquire lock: %v", err)
}
defer unlock()
m.metrics.DeleteObjectInc()
defer m.metrics.DeleteObjectDec()
if class == "" { // deprecated
return m.deleteObjectFromRepo(ctx, id)
}
ok, err := m.vectorRepo.Exists(ctx, class, id, repl, tenant)
if err != nil {
switch err.(type) {
case ErrMultiTenancy:
return NewErrMultiTenancy(fmt.Errorf("check object existence: %w", err))
default:
return NewErrInternal("check object existence: %v", err)
}
}
if !ok {
return NewErrNotFound("object %v could not be found", path)
}
err = m.vectorRepo.DeleteObject(ctx, class, id, repl, tenant)
if err != nil {
return NewErrInternal("could not delete object from vector repo: %v", err)
}
return nil
}
// deleteObjectFromRepo deletes objects with same id and different classes.
//
// Deprecated
func (m *Manager) deleteObjectFromRepo(ctx context.Context, id strfmt.UUID) error {
// There might be a situation to have UUIDs which are not unique across classes.
// Added loop in order to delete all of the objects with given UUID across all classes.
// This change is added in response to this issue:
// https://github.com/weaviate/weaviate/issues/1836
deleteCounter := 0
for {
objectRes, err := m.getObjectFromRepo(ctx, "", id, additional.Properties{}, nil, "")
if err != nil {
_, ok := err.(ErrNotFound)
if ok {
if deleteCounter == 0 {
return err
}
return nil
}
return err
}
object := objectRes.Object()
err = m.vectorRepo.DeleteObject(ctx, object.Class, id, nil, "")
if err != nil {
return NewErrInternal("could not delete object from vector repo: %v", err)
}
deleteCounter++
}
}
|